0

I'm doing an application in Laravel 5.3.19, the thing is, I'm doing a query with Eloquent but it is SO slow, I read some forums and seems like I'm doing something wrong, I tried doing this query in the console with the command php artisan tinker and the query work perfectly, the problem is when I log into the URL that I created in the routes/web.php from my browser, the page just load indefinitely and sometimes It gives to me a timeout error. Someone knows what could be the problem?

here are my files:

  • routes/web.php

Route::get('/area_products/listProductsByArea/{area}','AreaProductController@orderProductsListByArea'); 
  • Http/controllers/AreaProductController.php (Controller)
public function orderProductsListByArea($area){ $array_products = []; $products = AreaProduct::where('area_id', $area)->get(); foreach ($products as $data) { $product = [ 'id' => $data->id, 'price' => $data->price, 'product_id' => $data->product->id, 'product_name' => $data->product->name, 'product_category' => $data->product->category->name, 'product_reference' => $data->product->reference, 'product_code' => $data->product->code, 'area_id' => $data->area_id ]; array_push($array_products, $product); } } 
  • Http/AreaProduct.php (Model)
namespace App; use Illuminate\Database\Eloquent\Model; class AreaProduct extends Model{ public $table = "products_area"; public function product(){ return $this->belongsTo('App\Product'); } public function area(){ return $this->belongsTo('App\Area'); } } 

Note: This query should return near to 700 results, I noticed the problem is produced when I'm doing the relations stuff like 'product_name' => $data->product->name. Am I doing something wrong?

Thanks for your help.

1
  • 1
    foreach ($products as $data) {, your code will see places.. such as timeouts.. since you are using Lazy Load mercilessly. you should change $products = AreaProduct::where('area_id', $area)->get(); to $products = AreaProduct::where('area_id', $area)->with('product')->get(); to Eager Load the relationship. Commented Nov 1, 2017 at 4:30

1 Answer 1

2

Since you're using Eloquent relationships can't you just do this:

public function orderProductsListByArea($area){ // Load the Area products with the 'product' relationship (eager loading) $products = AreaProduct::where('area_id', $area) ->with('product') ->get(); // Return the list of products return $products; } 

Without seeing the rest of your data/db, I'm pretty sure that should return what you want.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you so much! it doesnt even take 2 seconds in the query, again, thank you so much, that's exactly what I needed

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.