簡體   English   中英

Laravel:與相關模型的總和

[英]Laravel : Sum with related models

我正在嘗試獲取具有多個步驟(帶有距離)的活動的總距離? 現在,我正在這樣做:

控制器:

$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個以獲取其步驟

您可以使用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

就像@Jeemusu所說的那樣,您的方法似乎很好。 但是,如果您想以其他方式進行操作,則可以嘗試以多種方式進行操作。

Laravel的“擁有很多通過”關系

“具有多次通過”關系為通過中間關系訪問遠距離關系提供了方便的捷徑。 例如,一個國家(地區)模型可能有多個“通過用戶”發布。

因此,通過使用許多方法,您可以直接訪問諸如

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

希望這可以幫到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM