首頁  >  文章  >  後端開發  >  laravel5.2 take的疑問

laravel5.2 take的疑問

WBOY
WBOY原創
2016-08-04 09:20:061543瀏覽

<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>

可以看見其實你加入takelimit 之類的限制,並不是對每一筆 作限制,而是全部取得的關聯數據作限制,所以當你設定很小的數量時,會造成一部分的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 中關聯資料表的查詢提供的資料與你取得的模型資料不匹配,因而導致查詢無結果。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn