我在Laravel中使用Eloquent。
案例:我正在构建一个API,其中有可能include
关系资源。因此,例如/api/teams?include=users
将为每个User
添加Team
模型。对于包含我正在使用Fractal的关系的逻辑。所以我需要有一些逻辑来确定必须包含哪个关系,所以我可以为它创建一个优化的查询。
问题:当我想使用相关的Team
模型渲染User
的集合时。我可以很好地加载模型。当我在User
模型上有自定义属性时会出现问题。这会导致N + 1查询问题,因为对于每个加载了热心的团队,因为将为每个模型执行自定义属性的查询。
示例代码:
// The Team model with the custom attribute
class Team extends Model {
protected $appends = ['is_member'];
public function getIsMemberAttribute() {
$loggedUser = Auth::currentUser();
$result = DB::table('team_user')
->where('team_id', $this-id)
->where('user_id', $loggedUser->id)
->get();
return !is_null($result);
}
}
// The controller code
$team = Team::findOrFail($teamId);
// So this will return all the User models that belong to the Team.
// The problem is this will execute the query inside the getIsMemberAttribute() for every User model.
dd($team->users);
有没有一个好的模式来解决这个问题?
答案 0 :(得分:0)
您可以遍历用户模型,看看其中一个是否与登录用户匹配。它比在数据库中查找它更有效。
class Team extends Model {
protected $appends = ['is_member'];
public function getIsMemberAttribute() {
$loggedUser = Auth::currentUser();
foreach ($this->users as $user) {
if ($user->id == $loggedUser->id) {
return true;
}
}
return false;
}
}