2013-05-29 41 views
4

我剛開始玩Laravel 4和Eloquent。我有一個博客表和許多其他相關的表吧:雄辯地提出了很多疑問

​​

我想顯示在一個網格中的以下信息:blog_idblog_titleusername和所有類別:

$data['blogs'] = Blog::with(array(
    'translations' => function ($q) { 
    $q->where('lang_id', '=', 1); 
    }, 
    'user', 
    'categories', 
    'categories.translations' => function ($q) { 
    $q->where('lang_id', '=', 1); 
    } 
))->get(); 

這執行5個查詢...他們是不是有點太多?只使用Fluent並將所有這些表加入1個更大的查詢會更好嗎?

回答

14

洋洋灑灑做了很多小的,索引的查詢比做一個大的查詢各種各樣的原因,一個更好的事情:

  • MySQL將不用加載臨時存儲多個表的每個查詢和查詢
  • 的SQL優化器將通過每個查詢
  • 它允許您緩存您的結果運行更迅速地之間可能會重新使用它們,而不必從數據拋出了JOIN S(以及其他類似的條款),這使緩存容易

你沒有真正注意到它,而是由SQL優化器所採取的路徑是以下查詢之間的相同:

SELECT a.*, b.* FROM a INNER JOIN b ON (a.id=b.id) WHERE a.id = 1 

SELECT a.*, b.* FROM a, b WHERE a.id = b.id AND a.id = 1 

他們都將導致SQL優化器來執行這些查詢低估引擎蓋:

SELECT a.* WHERE a.id = 1 

SELECT b.* WHERE b.id = 1 

從那裏,這取決於你的索引時,SQL優化器將進行匹配基礎上無論是indioces或全表數據。雄辯是幹什麼的?恰恰是這兩個查詢。你沒有通過一個大的查詢獲得任何東西 - 事實上,你正在失去數據可重用性。在任何情況下,都希望小型的,優化的,可重用的,可緩存的查詢來處理龐大的語句。

+0

要延長你的答案......一個巨大的連接查詢也將提供冗餘列/行,但在所有屬於關聯或hasOne關係,因爲你需要在每個關係最深的鏈接一個記錄 - 可惡! –

+1

非常感謝^^我無法投票答覆您的答案,因爲我沒有足夠的資格,但我已將其確認爲已接受。再次感謝你們倆^^乾杯 – faust