我可以渴望/延迟加载Laravel中的属性吗?

whi*_*ok6 1 php relationship eager-loading laravel-5

我知道我可以渴望或懒惰地在Laravel中建立关系。我也知道关系对象基本上是伪装的查询对象,并且调用会$user->load('teams')执行该查询并将其添加到$ user对象中(即使我不知道该怎么精确)。

假设我有一位User从评论中获得积分的人。为了在数据库调用中获取用户的分数,我将执行以下操作:

SELECT `user_id`, sum(`points`) AS `total_points` FROM `user_comments` where `id` = ?
Run Code Online (Sandbox Code Playgroud)

如果我想一次全部加载它们,我将运行以下查询:

SELECT `users`.*, sum(`user_comments`.`points`) AS `total_points`
FROM `users` LEFT JOIN `user_points` ON `users`.`id` = `user_comments`.`user_id`
GROUP BY `users`.`id`
Run Code Online (Sandbox Code Playgroud)

我想使用Laravel完成这些任务。我喜欢写这样的事情

User::where('age', '>', 40)->with('total_points')->get();
Run Code Online (Sandbox Code Playgroud)

并像这样访问值

$user->total_points
Run Code Online (Sandbox Code Playgroud)

同时加载用户及其总分。我希望可能会有很多很多记录,并且不想每次有用户时都总是调用数据库联接查询。如果我只需要它们的总分值,我也不想不为每个用户自己加载所有注释。

有没有一种方法可以使用关系生成器在Laravel中完成此任务?

sum*_*mit 5

在用户模型中建立一种关系,如下所示

public function total_points() {
        return $this->hasOne('user_comments')
            ->selectRaw('sum(points) as points, user_id')
            ->groupBy('user_id');
    }
Run Code Online (Sandbox Code Playgroud)

然后在控制器中执行此操作

$user = User::where('age', '>', 40)->with('total_points')->get();
Run Code Online (Sandbox Code Playgroud)