[英]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.