[英]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');
}
有合適的解決方案嗎?
謝謝你的幫助
執行此方法需要運行大量數據庫查詢:
您可以使用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所說的那樣,您的方法似乎很好。 但是,如果您想以其他方式進行操作,則可以嘗試以多種方式進行操作。
“具有多次通過”關系為通過中間關系訪問遠距離關系提供了方便的捷徑。 例如,一個國家(地區)模型可能有多個“通過用戶”發布。
因此,通過使用許多方法,您可以直接訪問諸如
$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.