渴望加载额外的模型属性

时间:2016-02-08 01:41:01

标签: php oop laravel eloquent

我在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);

有没有一个好的模式来解决这个问题?

1 个答案:

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