2016-01-20 55 views
1

我有一個用戶模型和一個屬性模型。用戶有3個角色:管理員,經理和經紀人。管理員可以查看所有屬性,而經理和經紀人只能查看分配給他們的屬性。經理或經紀人可能擁有許多房產,房產可能屬於任何數量的經理和經紀人。這裏是我的用戶模型properties關係:屬於很多得到所有行(Laravel)

/** 
* Get all properties belonging to this user. 
* 
* @return [type]   [description] 
*/ 
public function properties() 
{ 
    if ($this->isAdmin()) { 
     return Property::all(); 

    } elseif ($this->isManager() || $this->isBroker()) { 
     return $this->belongsToMany('App\Property'); 

    } 

    return null; 
} 

這個偉大的工程檢索所有屬性,但如果我要進行選擇或者聲明,我只能這樣做,如果用戶管理員,因爲如果用戶是管理員,當前代碼將返回整個Collection。這使得這種方法不可能用於搜索功能和任何類型的約束。

顯然,我不想在property_user表中爲每個屬性和管理員創建記錄,因爲這會佔用大量不必要的空間。但是,如果用戶是管理員或代理,我不希望在控制器中擁有其他邏輯,只調用properties方法,如果用戶是管理員,則執行自定義查詢。

有沒有什麼辦法可以返回一個有每一行的Illuminate\Database\Eloquent\Relations\BelongsToMany?或者我還可以將查詢鏈接到另一個Laravel對象?

回答

3

您將希望返回一個查詢對象。

public function properties() 
{ 
    if ($this->isAdmin()) { 
     return Property::query(); 
    } elseif ($this->isManager() || $this->isBroker()) { 
     return $this->belongsToMany('App\Property'); 
    } 

    return null; 
} 
+0

拋出了我一個'非靜態方法照亮\數據庫\雄辯\型號:: newQuery()不應該叫statically' – samrap

+0

我的道歉。這只是'query'而不是'newQuery'。答案已更新。 –

+0

太棒了!完美的作品。另一種方式,雖然我發佈這個問題後想到的方式是返回一個Property的新實例,它也是可查詢的。儘管如此,你的方法更清晰。謝謝! – samrap