预加载指定列

并不是总需要获取关系的每一列。在这种情况下,Eloquent 允许你为关联指定想要获取的列:

1
2
3
4
$result = User::with('topics:user_id,body,title')
    ->where('name', 'Summer')
    ->get()
    ->toArray();

注意:在使用这个特性时,一定要在要获取的列的列表中包含 id 列。『这里的 id 列是指关联字段列 user_id

如果要进行约束预加载,应该这样写。

1
2
3
4
5
6
7
$result = User::with(['topics' => function ($query) {
        $query->select('id', 'user_id', 'body', 'title')
            ->orderBy('updated_at', 'desc');
    }])
    ->where('name', 'Summer')
    ->get()
    ->toArray();

嵌套预加载指定字段的实现方法

1
2
3
4
5
6
$user = User::with(['posts'=>function($query) {
     $query->select('id','user_id','title')->orderBy('updated_at','desc');
     $query->with(['tags'=>function($query) {
          $query->select('tag');
     }]);
}])->where('id',1)->get();

没有添加约束的方法

1
$user = User::with(['posts:user_id,title','posts.tags'])->where('id',1)->get();

参考原文

记如何在预加载中指定查询的字段