Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel:与相关模型求和_Php_Laravel_Laravel 4_Laravel 5_Eloquent - Fatal编程技术网

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个,以获取其步骤
使用Elounce的聚合函数sum(),只需一次查询即可获得所需的数字:

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

希望这能对您有所帮助。

我认为您的方法很好,如果您打算在整个应用程序中重复使用此方法,您最好将代码从控制器移动到模型中的某个范围内。如果此解决方案对您来说太慢(许多活动都有许多步骤),那么您最好查询您的数据库。也许一个不太复杂的查询可以完成这项工作。