2016-03-11 26 views
0

我使用laravel-permission來管理角色和顯示內容。根據文檔,您可以使用$roles = $user->roles()->pluck('name')來檢索用戶角色。我的問題是,返回的數據是["admin"]而不僅僅是admin。我正在審查收集方法,它看起來像get('name')將返回我正在尋找。當我嘗試使用以下命令Auth::user()->roles()->get('name')我得到使用collection-> get()而不是collection-> pluck()

1/1 
ErrorException in BelongsToMany.php line 360: 
Argument 1 passed to Illuminate\Database\Eloquent\Relations\BelongsToMany::getSelectColumns() must be of the type array, string given 

在我看來,像get()方法需要一個數組但是,我想在數組中引用的項目。的Auth::user()->roles()->get()的原始輸出[{"id":1,"name":"admin","created_at":"2016-03-10 06:24:47","updated_at":"2016-03-10 06:24:47","pivot":{"user_id":1,"role_id":1}}]

我已經找到了解決辦法拉正確的內容,但它使用正則表達式用於去除包含在pluck()方法不需要的字符。

preg_replace('/\W/i','', Auth::user()->roles()->pluck('name')) 

好像我失去了一些東西,或者使用get()方法不正確地接近。任何建議表示讚賞。

回答

1

我認爲pluck()將返回集合中的每個模型的給定列的值,這將解釋該數組。在你的情況下,它看起來像用戶只有一個角色,所以你只有一個項目的數組。如果用戶有多個角色,那麼您可能會得到一個包含多個項目的數組。

另一方面,get()方法用於在構建查詢後針對數據庫執行查詢。查詢的結果是返回的。要返回只有一個值的模型集合,您需要傳遞一個只包含一列的數組,但這隻會選擇模型,而這看起來並不是您最終需要的。

可以代替試試這個:$roles = $user->roles()->first()->name

的先打電話()會搶用roles()返回集合中的第一個模型,然後你可以抓住從模型中的角色名稱。

我通常拋出一些錯誤解決此檢查:

$role = $user->roles()->first(); 

if (is_null($role)) { 
    //Handle what happens if no role comes back 
} 

$role_name = $role->name; 
1

這是因爲用戶可以有很多角色,所以角色是一個集合。 如果你是100%肯定用戶將只有一個角色,你可以很容易做到

Auth::user()->roles()->first()->name

這將讓該集合(角色),然後其名稱的第一個項目。