2017-01-05 47 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

我刚刚测试了这个确切的代码,它适用于多对多的关系。 –