Laravel 5 - Eloquent:过滤多种关系的简单方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 5 - Eloquent:过滤多种关系的简单方法相关的知识,希望对你有一定的参考价值。

我在列表和用户之间有很多关系。这是列表模型:

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

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

}

这是用户模型:

class User extends Authenticatable
{

    public function lists()
    {
    return $this->hasMany('AppModelsListModel');
    }
}

在列表页面中,我需要获取属于已登录用户的所有列表。我找到的唯一解决方案就是这个:

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

有没有更简单的方法来实现相同的结果?

答案

您的lists()关系未正确定义。 belongsToMany的逆仍然属于ToMany(hasMany的逆是belongsTo):

class User extends Authenticatable
{

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

然后你可以得到这样的列表:

$user = Auth::user();

$all_lists = $user->lists()->active()->get()
另一答案

由于当前用户已加载,您可以使用lazy eager loading为用户加载列表:

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

以上是关于Laravel 5 - Eloquent:过滤多种关系的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.1 Eloquent常见问题

在 Laravel Eloquent 中获取和过滤关系

Laravel cviebrock/eloquent-sluggable 将 @ 作为前缀或在路由中过滤它

如何在 Laravel Eloquent 上过滤相关模型

Laravel Eloquent - 使用过滤数据获取嵌套关系

Laravel (8.x) 这个多对多过滤问题有更好的 Eloquent 查询吗?