我试图获得具有多个步骤(距离)的活动的总距离?现在,我这样做:
控制器:
$total_distance = 0;
foreach (\Auth::user()->activities as $key => $activity) {
$total_distance += $activity->getTotalDistance();
}
活动模型:
public function steps()
{
return $this->hasMany('App\Step');
}
public function getTotalDistance()
{
return $this->steps->sum('distance');
}
有没有合适的解决方案?
感谢您的帮助
答案 0 :(得分:2)
执行此操作的方式需要运行大量的数据库查询:
使用Eloquent的聚合函数 sum(),只需一个查询即可获得所需的数字:
$total_distance = Step::join('activities', 'activity_id', '=', 'activities.id')->where('activities.user_id', Auth::id())->sum('distance');
您可以在此处阅读Eloquent提供的其他汇总方法:http://laravel.com/docs/5.1/queries#aggregates
答案 1 :(得分:0)
就像@Jeemusu所说,你的方法似乎很好。但是如果你想以其他方式做到这一点,你可以尝试以多种方式做到这一点。
请看Laravel's Has Many Through relationship。
“有很多通过”关系为通过中间关系访问远距离关系提供了方便的捷径。例如,Country模型可能有很多Post通过User模型。
因此,使用很多,您可以直接访问类似
的步骤$user->steps->sum('distance');
您需要建立用户在活动中有许多步骤的关系。
类似的东西:
class User extends Eloquent {
public function steps() {
$this->hasManyThrough('Steps','Activity','user_id','activity_id');
}
}
另一个解决方案是将外键放在步骤表中,以便您可以直接从用户模型访问它,如:
$user->steps->sum('distance');
class User extends Eloquent {
public function steps() {
$this->HasMany('Steps','user_id');
}
}
希望这可以帮到你。