2014-08-27 128 views
2

我有以下Laravel型號:從關係獲取所有記錄?

class User extends ConfideUser implements UserInterface, RemindableInterface 
{ 
    use HasRole; 

    public function stores() 
    { 
     if ($this->hasRole('root')) { 
      return $this->belongsToMany('Store')->orWhereNull('store_user.user_id'); 
     } else { 
      return $this->belongsToMany('Store'); 
     } 
    } 
} 

每個user屬於多個store S和通過標準的數據透視表'store_user'建立這種關係。

如果我這樣做,我得到的所有店鋪,爲用戶:

$stores = Auth::user()->stores; 

但是,如果用戶有root角色,我要檢索的所有門店。這很簡單,可以使用簡單的選擇來返回所有商店,但對於stores()方法來說,功能始終如一,Laravel希望它返回Illuminate\Database\Eloquent\Relations\Relation類型的對象。

如何返回一個Relation對象,而不是隻有root用戶在store_user數據透視表中擁有的所有商店?

回答

0

在模型不夠好,但.......這可能工作

public function stores() 
{ 
    if ($this->hasRole('root')) { 
     $all_stores = DB::table('where_ever_stores_are')->get(); 
     return $all_stores; 
    } else { 
     return $this->belongsToMany('Store'); 
    } 
} 

這隻會返回所有的商店,作爲關係可能會更難,什麼是放了你想在返回的數組?? ??

+0

我不認爲這會返回一個關係。 – 2014-08-27 16:11:22

0

我認爲你的設計有這種檢查是錯誤的!

只需

public function stores() 
{ 
    return $this->belongsToMany('Store'); 
} 

和你的控制器做檢查:

public function inMyController() 
{ 
    if ($user->hasRole('root')) { 
     return Store::all(); 
    } else { 
     return $user->stores; 
    } 
} 

你的模型應該只理會模型本身,而不是取權限的照顧。

更好的方法是創建一個處理所有模型查詢的Repository。然後,您的控制器只需與存儲庫進行交談。

+0

'用戶'模型直接通過'Confide'和'Entrust'類包擁有權限和角色管理。我只是想從'User'模型擴展功能,因爲這個關係也可以通過'Auth'和通過預加載來訪問,這在代碼的其餘部分非常方便。如果我將它移動到控制器上,我就會失去它並且必須通過IoC路線通過其他模型和控制器訪問這些功能。 – eComEvo 2014-08-27 18:43:54