我可以 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();
我知道我可以预先加载或延迟加载 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();