Laravel 5 - Eloquent:过滤多对多关系的更简单方法
Laravel 5 - Eloquent: easier way to filter a many to many relationship
我在列表和用户之间建立了多对多关系。
这是列表模型:
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();
有没有更简单的方法可以达到同样的效果?
由于当前用户已经加载,您可以使用lazy eager loading为用户加载列表:
auth()->user()->load('lists');
您的 lists() 关系定义不正确。 belongsToMany 的逆仍然是 belongsToMany(hasMany 的逆是 belongsTo):
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()
我在列表和用户之间建立了多对多关系。 这是列表模型:
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();
有没有更简单的方法可以达到同样的效果?
由于当前用户已经加载,您可以使用lazy eager loading为用户加载列表:
auth()->user()->load('lists');
您的 lists() 关系定义不正确。 belongsToMany 的逆仍然是 belongsToMany(hasMany 的逆是 belongsTo):
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()