【问题标题】:Laravel : Sum with related modelsLaravel:与相关模型求和
【发布时间】:2015-08-12 08:35:26
【问题描述】:

我正在尝试获取具有多个步骤(有距离)的活动的总距离?目前,我正在这样做:

控制器:

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

有合适的解决方案吗?

感谢您的帮助

【问题讨论】:

  • 您的方法对我来说似乎很好,如果您要在整个应用程序中重用它,您最好将代码从控制器移动到模型中的范围内。
  • 如果这个解决方案对你来说太慢了(很多活动和很多步骤),你最好查询你的数据库。可能一个不太复杂的查询就可以完成这项工作。

标签: php laravel laravel-4 laravel-5 eloquent


【解决方案1】:

你这样做的方式需要运行相当多的数据库查询:

  • 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

【讨论】:

    【解决方案2】:

    就像@Jeemusu 所说,您的方法似乎很好。但是,如果您想以其他方式来做,您可以尝试以多种方式来做。

    Laravel's Has Many Through relationship

    “多通”关系为通过中间关系访问远距离关系提供了便捷的捷径。例如,一个 Country 模型可能有许多 Post through 一个 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');
        }
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2018-05-31
      • 2021-11-19
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      相关资源
      最近更新 更多