<code>$room=\App\Model\Room::with(['items'=>function($query){ $query->take(12); }])->get();</code>
上面這段程式碼每一個room下面的items都是空的,當註解掉$query->take(12);
的時候,items又有了,為什麼?
<code>$room=\App\Model\Room::with(['items'=>function($query){ $query->take(12); }])->get();</code>
上面這段程式碼每一個room下面的items都是空的,當註解掉$query->take(12);
的時候,items又有了,為什麼?
嗯...理由其實很簡單,你可以加個 dd()
來看下其生成的 SQL
:
<code class="php">$room = \App\Model\Room::with(['items' => function($query){ dd($query->take(12)->toSql()); }])->get();</code>
會產生如下 SQL
( ? 數量代表你的 Room
有幾個):
<code class="sql">select * from `machines` where `machines`.`series_id` in (?, ?, ?) limit 12</code>
可以看見其實你加入take
、 limit
之類的限制,並不是對每一筆
作限制,而是全部取得的關聯數據作限制,所以當你設定很小的數量時,會造成一部分的Room
沒有Item
,你可以把這個數字設的很大,例如100000
,你就會發現items
有數據了,因為你的限制大於數據量。
至於要如何讓限制每筆的關聯數據,找了一些資料都沒有簡單點的實現方式,目前看起來最可靠的是這個:
Tweaking Eloquent relations – how to get N related models per parent ?
看不懂什麼意思 $room=AppModelRoom::with('items')->take(12);
很顯然,沒匹配到。
所有的 with 是透過關聯模型實現的 abstract public function addEagerConstraints(array $models)
方法。
你會發現原因是 with
中關聯資料表的查詢提供的資料與你取得的模型資料不匹配,因而導致查詢無結果。