Consider 3 tables as below
class Post extends Model
{
public function tags()
{
return $this->belongsToMany(Tag::class, 'post_tags', 'post_id', 'tag_id');
}
}
posts table
|id | title |
+---+---------+
|1 | post1 |
|2 | post2 |
|3 | post3 |
|4 | post4 |
tags table
|id | value |
+---+---------+
|1 | tag01 |
|2 | tag02 |
|3 | tag03 |
|4 | tag04 |
post_tags table
| post_id | tag_id |
+----------+---------+
| 1 | 1 |
| 2 | 3 |
| 2 | 4 |
| 3 | 1 |
| 4 | 1 |
| 4 | 4 |
The only post that has both tag01 and tag04 is post with id = 4
But when I get posts with this code
Post::whereHas('tags', function($q) {
$q->whereIn('tag_id', [1, 4]);
}
I get all the posts that has tag01 or tag04.
I want to get Posts where have both tag01 and tag02 in its tags relation.
How can I achieve this result using Eloquent or if it's not possible using QueryBuilder