2017-07-17 181 views
1

我belongsToMany關係在我的項目:Laravel belongsToMany VS創建中間表模型

public function products() { return $this->belongsToMany(Product::class,'order_products','order_id','product_id') ->withPivot('amount') ->withTimestamps(); }

因此我沒有爲中間表order_products任何模型。在這一點上,一切都很好,但我對這種關係有疑問。

  1. belongsToMany關係使我寫這樣的查詢:

    $cart=Auth::user()->orders() ->where('status', 0) ->firstOrFail() ->products() ->newPivotStatement() ->join('products', 'order_products.product_id', '=', 'products.id') ->select(DB::raw('products.*,(products.price * order_products.amount) as newPrice'), 'order_products.amount') ->get(); 不會造成性能問題?那麼我應該使用order_products表的模型嗎? (請注意,我有多個這樣的查詢)。

  2. 我應該使用查詢生成器來獲得第一個問題的結果,還是應該使用集合方法來獲取此結果(如sum(),each()方法..)以實現性能。

  3. 一般來說,哪一個是高性能的:嘗試使用sql查詢來獲得精緻的結果或獲得結果,然後使用php/laravel進行優化?

系統:laravel 5.4/7.1的PHP/MySQL的5.7

對不起我的英語不好。謝謝你們。

回答

1

讓我們來分析一下使用Laravel查詢數據庫時發生的情況。

  1. 使用Eloquent /數據庫查詢生成器來生成SQL。
  2. 將生成的SQL發送到數據庫並執行。
  3. 從數據庫中獲取結果數據。
  4. 從數據中提取水合物Eloquent模型實例(如果使用Eloquent)或純PHP對象(如果使用查詢生成器)。

對於大多數情況下,第二步是瓶頸,您應該檢查生成的SQL以查看是否可以改進它。

對於您的問題:

  1. 劑量它會導致性能問題?那麼我應該使用order_products表的模型嗎?

    性能取決於您的數據庫和生成的SQL。爲order_products使用模型可能有助於簡化代碼,但它對性能沒有直接影響。

  2. 我應該使用查詢生成器來獲得第一個問題的結果,還是應該使用集合方法來獲取此結果(如sum(),each()方法..)以實現性能。

    如果您不能使用查詢生成器來生成更高性能的SQL語句,那麼就不需要切換。使用集合通常意味着您需要從數據庫中獲取數據到PHP內存,然後在PHP中計算結果,如果您有大型數據集進行查詢,我相信它會變慢。

  3. 一般來說,哪一個是高性能的:嘗試使用sql查詢來獲得精緻的結果或獲得結果並僅使用php/laravel進行優化?

    爲了獲得更好的性能,您應該關注SQL語句。一旦獲得了高性能的SQL,您可以使用Eloquent/Query構建器或您覺得方便的方式構建它,或者您可以將sql傳遞給\ DB :: select()以獲取結果。雄辯和數據庫查詢構建器在構建sql語句時具有性能成本,但與大多數情況下的SQL執行相比,這些成本可能會被忽略。

+0

謝謝你的回答。但第三個需要清晰。對於instane,讓我們考慮一下這兩個代碼片段DB :: all() - > sortBy('price'); DB:排序依據( '價格', 'ASC') - >獲得(); ,哪一個更具表現力?正如你所看到的,第一個獲取所有數據,然後用laravel collection的方法進行分類。但第二個獲得數據排序。看起來第二個在sql上做了更多的工作,第一個在php/laravel上做了更多的工作。那麼應該選擇哪一個? – iedmrc99

+1

如果數據庫可以使用索引[優化按順序的子句](https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html),那麼數據庫排序的性能是更好。如果數據集非常大,您應該考慮PHP是否有足夠的內存來處理這些數據。如果PHP和數據庫都有足夠的內存,可以參考[本答案](https://stackoverflow.com/a/3620992/2042600)。一般來說,數據庫排序具有更好的性能。我認爲你需要對數據進行測試才能得到確切的答案。 – yixiang