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

问题描述 投票:0回答:2

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('........')
php laravel eloquent
2个回答
0
投票

是的,你可以使用 Laravel 预加载来获取所有结果。

获取用户所有相册,然后是所有相册照片,然后是照片标签。

User::with(['albums.photos.tags'])->where('username',$user)->firstOrFail();

您甚至可以像

一样查询嵌套关系
return User::with(['albums' => function($query){
            $query->where('id',1);
        }])->where('username',$user)->firstOrFail();

查看更多关于预加载


0
投票

急切加载

尝试使用即时加载

$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 和绑定

© www.soinside.com 2019 - 2024. All rights reserved.