Php Laravel:与相关模型求和
我正在尝试获取具有多个步骤(带距离)的活动的总距离?现在,我是这样做的: 控制器:Php Laravel:与相关模型求和,php,laravel,laravel-4,laravel-5,eloquent,Php,Laravel,Laravel 4,Laravel 5,Eloquent,我正在尝试获取具有多个步骤(带距离)的活动的总距离?现在,我是这样做的: 控制器: $total_distance = 0; foreach (\Auth::user()->activities as $key => $activity) { $total_distance += $activity->getTotalDistance(); } 活动模型: public function steps() { return $this->hasMany('
$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');
}
有没有合适的解决办法
感谢您的帮助您这样做需要运行大量的数据库查询:
- 1以获取用户活动
- 每个活动1个,以获取其步骤
$total_distance = Step::join('activities', 'activity_id', '=', 'activities.id')->where('activities.user_id', Auth::id())->sum('distance');
您可以在这里阅读雄辩地提供的其他聚合方法:正如@Jeemusu所说,您的方法似乎很好。但是如果你想用其他的方法来做,你可以试着用几种方法来做 看 “has many through”关系为通过中间关系访问远程关系提供了方便的捷径。例如,一个国家/地区模型可能有许多通过用户模型发布的帖子 因此,通过使用,您可以直接访问以下步骤
$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');
}
}
希望这能对您有所帮助。我认为您的方法很好,如果您打算在整个应用程序中重复使用此方法,您最好将代码从控制器移动到模型中的某个范围内。如果此解决方案对您来说太慢(许多活动都有许多步骤),那么您最好查询您的数据库。也许一个不太复杂的查询可以完成这项工作。