Maison > développement back-end > tutoriel php > laravel5.2 take的疑问

laravel5.2 take的疑问

WBOY
Libérer: 2016-08-04 09:20:06
original
1569 Les gens l'ont consulté

<code>$room=\App\Model\Room::with(['items'=>function($query){
                $query->take(12);  
            }])->get();</code>
Copier après la connexion
Copier après la connexion

上面这段代码每一个room下面的items都是空的,当注释掉$query->take(12);的时候,items又有了,为什么?

回复内容:

<code>$room=\App\Model\Room::with(['items'=>function($query){
                $query->take(12);  
            }])->get();</code>
Copier après la connexion
Copier après la connexion

上面这段代码每一个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>
Copier après la connexion

會產生如下 SQL ( ? 數量代表你的 Room 有幾個):

<code class="sql">select * from `machines` where `machines`.`series_id` in (?, ?, ?) limit 12</code>
Copier après la connexion

可以看見其實你加入 takelimit 之類的限制,並不是對 每一筆 作限制,而是全部取得的關聯數據作限制,所以當你設置很小的數量時,會造成一部分的 Room 沒有 Item ,你可以把這個數字設的很大,例如 100000 ,你就會發現 items 有數據了,因為你的限制大於數據量。

至於要如何讓限制每筆的關聯數據,找了一些資料都沒有簡單點的實現方式,目前看起來最靠譜的是這個:

Tweaking Eloquent relations – how to get N related models per parent ?

看不懂什么意思 $room=\App\Model\Room::with('items')->take(12);

很显然,没匹配到。

所有的 with 是通过关联模型实现的 abstract public function addEagerConstraints(array $models) 方法。

你会发现原因就是 with 中关联数据表的查询提供的数据与你获取的模型数据不匹配,因而导致查询无结果。

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal