![](/img/trans.png)
[英]How to get posts by current tag and category simultaneously in Laravel?
[英]Laravel get posts have atleast one tag on each category of tags
我想列出所有帖子在我選擇的每個類別上至少有一個標簽。 在我們的 laravel 應用程序中,我們有一個帖子和標簽 model。
在 model 后,我們有:
public function tags()
{
return $this->belongsToMany(Tag::class, 'post_tags', 'post_id', 'tag_id');
}
對 select 帖子的查詢有至少一個 {3,2} 標簽和至少一個 {8,10}?
我寫了這段代碼:
$tags = ['news' => [3,2], 'alert' => [8,10]];
Post::whereHas('tags', function($query) use ($tags){
foreach($tags as $category => $tag){
$query->whereIn('tags.id', $tag);
}
}
帖子
+---------+---------------+
| id | title |
+---------+---------------+
| 1 | post 1... |
| 2 | post 2... |
| 3 | post 3... |
| 4 | post 4... |
| 5 | post 5... |
| 6 | post 6... |
| 7 | post 7... |
| 8 | post 8... |
| 9 | post 9... |
+---------+---------------+
標簽
+---------+-------+------------+
| id | name | category |
+---------+-------+------------+
| 1 | stock | news |
| 2 | acc | news |
| 3 | etc | news |
| 4 | eco | news |
| 5 | side | ads |
| 6 | head | ads |
| 7 | footer| ads |
| 8 | info | alert |
| 9 | danger| alert |
| 10 |success| alert |
+---------+-------+------------+
post_tags
+-----------+---------+
| post_is | tag_id |
+-----------+---------+
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 1 | 8 |
| 1 | 9 |
| 1 | 10 |
| 9 | 9 |
| 9 | 6 |
| 3 | 7 |
| 7 | 1 |
| 7 | 2 |
| 7 | 8 |
+-----------+---------+
但結果什么都沒有。
我需要 Eloquent 后的結果,查詢性能很重要。
larave 版本是 5.8.35
我將從一個原始的 MySQL 查詢開始,它可以完成工作。 然后,圍繞它構建您的 Laravel 腳本。
SELECT
p.id,
p.title
FROM posts p
INNER JOIN post_tags pt
ON pt.post_id = p.id
GROUP BY
p.id,
p.title
HAVING
SUM(pt.tag_id IN (2, 3)) > 0 AND
SUM(pt.tag_id IN (8, 10)) > 0;
您的 Laravel 代碼:
$posts = DB::table('posts p')
->join('post_tags pt', 'pt.post_id', '=', 'p.id')
->groupBy('p.id', 'p.name')
->havingRaw('SUM(pt.tag_id IN (2, 3)) > 0 AND SUM(pt.tag_id IN (8, 10)) > 0')
->select('p.id', 'p.name')
->get();
我認為您忘記編寫get()
方法並且還缺少右括號。
嘗試以下查詢:
$posts = Post::whereHas('tags', function($query) use ($tags){
foreach($tags as $category => $tag){
$query->whereIn('tags.id', $tag);
}
})->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.