Laravel:总结相关模型

时间:2015-08-12 08:35:26

标签: 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('App\Step');
}

public function getTotalDistance()
{
    return $this->steps->sum('distance');
}

有没有合适的解决方案?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

执行此操作的方式需要运行大量的数据库查询:

  • 1以获取用户活动
  • 每个活动1次以获取其步骤

使用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');
    }
}

希望这可以帮到你。