2017-05-02 64 views
0

我有以下幾點:Laravel:如何在belongsToMany關係上編寫連接計數查詢?

  • 用戶,角色,用ROLE_USER透視表和belongsToMany 關係
  • 用戶,位置,與location_user透視表和belongsToMany關係

有2個角色爲用戶:店主&園丁

位置有一個'gardeners_max'字段

在模型中的位置:

protected $appends = ['is_full']; 

public function getIsFullAttribute() 
{ 
    return $this->attributes['name'] = $this->remainingGardeners() <= 0; 
} 

public function countGardeners() 
{ 
    return $this->gardeners()->count(); 
} 

public function remainingGardeners() 
{ 
    return $this->gardeners_max - $this->countGardeners(); 
} 

現在,這樣做:

Location::all(); 

我得到的是:

[ 
{ 
    name: 'LocationA', 
    gardeners_max: 3, 
    owners: [...], 
    garderners: [...] 
    ... 
    is_full: false 
} 
] 

這是很酷。但是......不可能對附加屬性執行WHERE子句。

Location::where('is_full',true)->get() // Unknown column 'is_full' in 'where clause' 

所以我想編寫一個連接查詢,所以我可以做is_full

WHERE子句和我簡直找不到路。任何幫助將不勝感激!

重要:

我知道濾波器()方法得到的結果,但我需要在這裏做一個scopeQuery

回答

0

你可以嘗試加載從數據庫中的對象之後,再操縱Collection

Location::get()->where('is_full', true)->all(); 

(你必須使用get第一則all,不知道它的工作原理其他方式)

不確定它的優化思想。

+0

感謝狀,但正如我剛纔編輯我真正需要做的(和理解)如何編寫連接查詢 – sebap

0

可以使範圍在選址模型這樣

public function scopeFull(Builder $query) 
{ 
    return $query->where('is_full', true); 
} 

現在你只得到所有位置這

Location::full()->get(); 
+0

謝謝,但它不會工作,因爲附加屬性不在WHERE子句中考慮...所以我想我需要一個連接查詢在這裏 – sebap