讨论数量:
$users = App\User::with(['posts' => function ($query) {
$query->orderBy('created_at', 'desc');
}])->get();
加 limit 不能实现目的,不是认为的会为每个 creator 都进行一次查询,with 是预加载,只会统一执行一次sql,相当于 hotWorks() 里边的query 再加上 whereIn(‘cid’,[1,2,3]),然后底层将这次查询出来的数组根据关联外键匹配到 creators 身上,因为 with(‘hotworks’) 只返回一条 cid=1 的数据,所以只匹配到了 id 为 1 的 creator 身上。靠预加载实现比较难,可以试着去掉 limit,然后遍历creators,对每个creator->hotworks,进行截取前N条,当然适合每个creater 的 hotworks 并不多的情况下。实在不行就不用 with,直接遍历分别sql查询,看具体情况,没有性能问题的情况下笨方法也不是不行。
加 limit 不能实现目的,不是认为的会为每个 creator 都进行一次查询,with 是预加载,只会统一执行一次sql,相当于 hotWorks() 里边的query 再加上 whereIn(‘cid’,[1,2,3]),然后底层将这次查询出来的数组根据关联外键匹配到 creators 身上,因为 with(‘hotworks’) 只返回一条 cid=1 的数据,所以只匹配到了 id 为 1 的 creator 身上。靠预加载实现比较难,可以试着去掉 limit,然后遍历creators,对每个creator->hotworks,进行截取前N条,当然适合每个creater 的 hotworks 并不多的情况下。实在不行就不用 with,直接遍历分别sql查询,看具体情况,没有性能问题的情况下笨方法也不是不行。