连接查询中的雄辩代码重复

时间:2014-12-29 09:11:33

标签: laravel eloquent

是否有一个设计模式用于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('........')

2 个答案:

答案 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