2017-02-23 75 views
1

我知道我可以渴望或懒惰加载Laravel的关系。我也知道,关系对象是变相的基本查询对象,并调用执行$user->load('teams')该查询,并将其添加到$用户对象(即使我不知道究竟怎么了。)我可以在Laravel中加载属性吗?

说我有一个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中使用关系生成器来完成此操作?

回答

4

,让您的用户模型一个关系如下图所示

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(); 
+0

这工作!一旦我得到了这个工作,我添加了一个$ appends属性来检查关系是否已加载并获取该值。 – whiterook6

+0

但是,如果它是一个属性是不可能的!我必须为此做些什么? – shmoolki