laravel/eloquent 是否有一种设计模式来处理以下代码重复:
用户有相册,相册有照片,照片有标签。
我有一个特殊查询来连接单个相册和标签中的照片。
public function GetJoinedAlbum()
{
return Photos::where(...in a specific album ...)->
join(... tags ...)-> ...
}
我使用相同的联接查询来联接带有标签的用户的所有照片。
Photos::where(... belong to a specific user ...)
join(... tags ...)->...
我不能使用“with”,因为我想继续查询结果
GetJoinedAlbum()->where('........')
是的,你可以使用 Laravel 预加载来获取所有结果。
获取用户所有相册,然后是所有相册照片,然后是照片标签。
User::with(['albums.photos.tags'])->where('username',$user)->firstOrFail();
您甚至可以像
一样查询嵌套关系return User::with(['albums' => function($query){
$query->where('id',1);
}])->where('username',$user)->firstOrFail();
查看更多关于预加载
急切加载
尝试使用即时加载
$user->with('album.photos.tags');
原始查询
$yourBaseQuery = $query->join(...)->join(...)->where(...)->getQuery();
然后,从查询中您可以获得绑定、wheres 和连接。
$joins = $yourBaseQuery->joins;
$wheres = $yourBaseQuery->wheres;
$bindings = $yourBaseQuery->getBindings();
$anotherQuery = $query->join(...)->join(...)->where(...)->getQuery();
$anotherQuery->joins = array_merge($joins, $anotherQuery->joins);
$anotherQuery->mergeWheres($wheres, $bindings);
$result = $anotherQuery->first(); // or all, or continure build your query.
因此,您的 anotherQuery 将具有来自第一个查询的联接、wheres 和绑定