2017-01-05 45 views
1

我有一個列表和用戶之間的多對多關係。 這是List型號:Laravel 5 - 雄辯:更簡單的方法來過濾多對多的關係

class ListModel extends Model 
{ 
    protected $table = "lists"; 

    public function users() 
    { 
    return $this->belongsToMany('App\Models\User', 'list_user', 'list_id', 'user_id')->withTimestamps(); 
    } 

} 

這是用戶模式:

class User extends Authenticatable 
{ 

    public function lists() 
    { 
    return $this->hasMany('App\Models\ListModel'); 
    } 
} 

在列表頁,我需要把所有屬於登錄用戶的列表。我發現的唯一解決方案是:

$user = \Auth::user()->id; 
$all_lists = ListModel::whereHas('users', function ($query) use ($user) { 
    $query->where('user_id', $user); 
})->active()->get(); 

有沒有更簡單的方法來實現相同的結果?

+0

發現這個有用https://laracasts.com/discuss/channels/laravel/how-to-eager-load-a-relation-on-authuser – Gayan

回答

0

你的列表()關係不正確定義。 belongsToMany的逆仍belongsToMany(的hasMany的倒數屬於關聯):

class User extends Authenticatable 
{ 

    public function lists() 
    { 
     return $this->belongsToMany('App\Models\ListModel', 'list_user', 'user_id', 'list_id')->withTimestamps(); 
    } 
} 

然後你就可以拿到名單如下:

$user = \Auth::user(); 

$all_lists = $user->lists()->active()->get() 
+0

非常感謝,看起來好多了! – Dani

1

由於當前用戶已經加載,你可以使用lazy eager loading加載列表供用戶選擇:

auth()->user()->load('lists'); 
+0

我試過了,但它只是返回用戶列表 – Dani

+0

@Dani此代碼無法返回用戶列表。看來你修改了代碼。請告訴我你正在使用的確切代碼。 –

+0

我剛剛測試了這個確切的代碼,它適用於多對多的關係。 –