whi*_*ok6 2 join eager-loading laravel
我读过几篇关于为什么急切加载使用多个查询而不是加入此处、此处和此处的文章。但是,我认为有必要使用联接而不是急切加载。我将如何构造查询,以便可以访问子对象,就好像它是通常急切加载的对象一样?
示例:获取居住在某条街道上的人员,并同时加载该地址。我不想加载这个人的所有地址,因为他住在很多地方;仅匹配查询的位置。通过急切加载和 whereHas,我必须重复查询,而且查询并不总是这么简单:
People::with(['address', function($query) use ($street_name){
return $query->where('street_name', $street_name);
}])->whereHas('address', function($query) use ($street_name){
return $query->where('street_name', $street_name);
})->get();
Run Code Online (Sandbox Code Playgroud)
可能
People::query()->join('address', function($join){
$join->on(...)
})->where('street_name', $street_name);
Run Code Online (Sandbox Code Playgroud)
那么问题是我不能使用这个:
$person->address
Run Code Online (Sandbox Code Playgroud)
有没有办法接受连接并对其进行按摩(使用选择?),使其看起来像是急切加载的?
小智 5
您可以执行以下操作:
People::join('addresses', 'addresses.people_id', '=', 'people.id')
->selectRaw('people.*')
->where('street_name', $street_name)
->with('addresses')
->get();
Run Code Online (Sandbox Code Playgroud)
这使用了连接和预加载。
仅通过连接,您就可以访问以下内容:
$person->street_address
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1337 次 |
| 最近记录: |