我可以 eager/lazy 在 Laravel 中加载属性吗?

Can I eager/lazy load an attribute in Laravel?

我知道我可以预先加载或延迟加载 Laravel 中的关系。我也知道关系对象基本上是伪装的查询对象,调用 $user->load('teams') 执行该查询并将其添加到 $user 对象(即使我不知道具体如何。)

假设我有一个 User 从评论中获得积分。要在数据库调用中获取用户的积分,我会执行如下操作:

SELECT `user_id`, sum(`points`) AS `total_points` FROM `user_comments` where `id` = ?

如果我想一次加载它们,我会运行这个查询:

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`

我想使用 Laravel 来完成这些任务。我会喜欢写这样的东西

User::where('age', '>', 40)->with('total_points')->get();

并像这样访问值

$user->total_points

同时加载用户和他们的总分。我希望可能有很多很多记录,并且不想每次有用户时都调用数据库连接查询。如果我只需要他们的总分值,我也不希望自己为每个用户加载所有评论。

在 Laravel 中有没有办法使用关系构建器来完成此操作?

在您的用户模型中建立如下关系

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

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

$user = User::where('age', '>', 40)->with('total_points')->get();