Laravel eloquent 获取所有记录,其中包含多对多关系中的所有 id

2021-12-26 00:00:00 relationship php laravel eloquent

我有一个 Posts 表,它有三个字段 idtitledescription.

I have a Posts table it has three fields id, title, description.

我的发布模型

class Post extends Model
{
    use SoftDeletes;

    protected $fillable = ['title', 'description'];

    public function tags()
    {
        return $this->belongsToMany(Tag::class, 'post_tag');
    }
}

我的标签模型

class Tag extends Model
{
    use SoftDeletes;

    protected $fillable = ['name'];

    public function posts()
    {
        return $this->belongsToMany(Post::class, 'post_tag');
    }
}

现在我想获得帖子&在我有标签过滤器的地方分页,例如我有两个标签 animals &news id 1 &2.现在我想获取所有带有标签 1 & 的帖子2 &分页.这是我试过的

Now I want to get posts & paginate where I have a tag filter e.g I have two tags animals & news which has id 1 & 2. Now I want to get all posts which has tag 1 & 2 & paginate. Here is what I tried

        Post:: with('tags')->whereHas('tags', function($q) {
            $q->whereIn('id', [1, 2]);
        })->paginate();

但在这里,我是 whereIn,它返回的帖子有标签 12both.但我想要同时具有标签 ID 1 和标签的帖子2.

But here as I am whereIn it returns posts has tags 1 or 2 or both. But I want post who has both tag id 1 & 2.

我使用的是 Laravel 5.2.

推荐答案

我一直在寻找相同的东西并受到 this stackoverflow MySQL answer,我已经结束了这个

I have been looking for the same thing and inspired by this stackoverflow MySQL answer, I have ended up with this

代码:

Post:: with('tags')->whereHas('tags', function($q) {
    $idList = [1,2];
    $q->whereIn('id', $idList)
      ->havingRaw('COUNT(id) = ?', [count($idList)])
})->paginate();

因为我想我可能会在一些地方使用它,所以我已经把它变成了一个特性,你可以在这里查看.如果您在 Post 类中包含 trait,您可以像下面这样使用.

Because I think I might use it in a few places I have made it into a trait which you can view here. Which if you included the trait in your Post class you could use like the following.

代码:

Post::with('tags')->whereHasRelationIds('tags', [1,2])->paginate();

相关文章