2016-04-09 139 views
1

我想知道是否有人可以提供一些關於重構以下函數以減少數據庫查詢數量的建議?另外,使用Laravel可能會有完全不同的方式來實現這一點。重構Laravel函數以減少數據庫查詢的數量

我試圖計算在P & l對於作業,這是由產品,這是由組件組成:

public function jobProfitAndLoss($id) 
{ 
    $products_in_job = DB::table('job_product') 
      ->where('job_id', $id) 
      ->get(); 

    $total_price = 0.0000; 
    $total_cost = 0.0000; 

    foreach ($products_in_job as $row) { 
     $total_price = $total_price + ($row->quantity)*($row->price); 

     $product_id = $row->product_id; 

     $components_in_product = DB::table('components') 
      ->where('product_id', $product_id) 
      ->get(); 

     foreach ($components_in_product as $component) { 
      $total_cost = $total_cost + ($component->cost)*($row->quantity); 
     } 

    } 

    return $total_price-$total_cost; 

} 

產品有成分 -

https://www.dropbox.com/s/ncnij8dnh99sb9v/Screenshot%202016-04-09%2015.22.26.png?dl=0

組件屬於產品 -

https://www.dropbox.com/s/3dx6u30gbod2rv4/Screenshot%202016-04-09%2015.23.43.png?dl=0

喬布斯有很多產品 -

https://www.dropbox.com/s/q179t0knd7y8z4k/Screenshot%202016-04-09%2015.24.11.png?dl=0

在這裏你會看到有一些相同的查詢被執行多次,這我不知道如何避免這種情況 -

https://www.dropbox.com/s/xonbtx9cdqvq1wd/Screenshot%202016-04-09%2015.33.07.png?dl=0

任何幫助,非常感謝。

回答

1

編輯:看來你沒有使用模型。如果您還沒有這樣做,請爲您的數據庫條目創建模型。您需要使用protected $table屬性job_product,因爲Eloquent可能無法自動將您的類名轉換爲正確的表名。

首先,建立關係,如果你還沒有這樣做。例如,Job.php下,包括產品的關係:

public function products() { 
    return $this->hasMany(App\Products::class); // Assuming App is the namespace 
} 

現在,而不是使用$ components_in_product一個流利的查詢,您可以直接做$components_in_product = $products_in_job->products;。但是,這仍然導致N + 1個查詢。

結果,看看這個:https://laravel.com/docs/5.2/eloquent-relationships#eager-loading

$books = App\Book::with('author')->get(); 

foreach ($books as $book) { 
    echo $book->author->name; 
} 

對於此操作,只有兩個查詢被執行:

select * from books 
select * from authors where id in (1, 2, 3, 4, 5, ...) 

因此,改變$products_in_job到雄辯的查詢並將->with('products')添加到查詢中。

+0

我有我的模型所有設置(工作,產品,組件),和他們的關係。 – trh88

+0

好的。在這種情況下,只需切換到Eloquent並在('products');'中使用' - >,然後用'$ row-> products'引用。 – ThePurpleK

+1

@TomHoad作爲參考,它被稱爲「急切加載」。您可以在[documentation here](https://laravel.com/docs/5.2/eloquent-relationships#eager-loading)中閱讀它。 – patricus