是否有一个设计模式用于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('........')
答案 0 :(得分:0)
急切加载
尝试使用急切的
$user->with('album.photos.tags');
原始查询
$yourBaseQuery = $query->join(...)->join(...)->where(...)->getQuery();
从查询开始,您可以获得绑定,轮询和连接。
$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将会有第一个查询的连接,轮询和绑定
答案 1 :(得分:0)
是的,您可以使用Laravel eager loading来获取所有结果。
获取用户的所有相册,然后获取所有相册照片和照片标签。
User::with(['albums.photos.tags'])->where('username',$user)->firstOrFail();
您甚至可以查询嵌套关系,例如
return User::with(['albums' => function($query){
$query->where('id',1);
}])->where('username',$user)->firstOrFail();
详细了解Eager loading