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中完成此任务?
在用户模型中建立一种关系,如下所示
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)
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |