Php Laravel get Post在每个标签类别上至少有一个标签

Php Laravel get Post在每个标签类别上至少有一个标签,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我想列出所有帖子,在我选择的每个类别上至少有一个标签。 在我们的laravel应用程序中,我们有一个Post和Tag模型 在Post模型中,我们有: public函数标签() { 返回$this->belongtomany(标记::class,'post_标记','post_id','Tag_id'); } 选择至少有一个{3,2}标记和至少一个{8,10}标记的post的查询是什么 我写这段代码: $tags=['news'=>[3,2],'alert'=>[8,10]; Post::whe

我想列出所有帖子,在我选择的每个类别上至少有一个标签。 在我们的laravel应用程序中,我们有一个Post和Tag模型

在Post模型中,我们有:

public函数标签()
{
返回$this->belongtomany(标记::class,'post_标记','post_id','Tag_id');
}
选择至少有一个{3,2}标记和至少一个{8,10}标记的post的查询是什么

我写这段代码:

$tags=['news'=>[3,2],'alert'=>[8,10];
Post::whereHas('tags',函数($query)use($tags){
foreach($category=>$tag的标记){
$query->where('tags.id',$tag);
}
}
职位

标签

邮政标签

+-----------+---------+
|  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    |
+-----------+---------+
但结果一文不值

我需要的结果后雄辩和查询性能是重要的


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();

我将从一个原始的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()吗?你的代码看起来不错。你能检查生成的原始查询吗?你写过get()吗在查询中?非常感谢,但是没有工作,因为
与sql\u mode=only\u full\u group\u by
不兼容,这里有些不对劲,因为我的查询应该与
only\u full\u group\u by
模式兼容。你确定你正在运行我的代码,完全没有修改吗?不,你的代码不工作,所以我只应用了一些c您的代码错误是:
SQLSTATE[42S02]:找不到基本表或视图:1146表“temp.posts p”不存在…
@tim biegeleisenI不知道您确切的表名,我只知道您在问题中共享的信息。根据这些信息,我的答案是有效的。我的表名与您的代码完全相同,但我不知道问题出在哪里。非常感谢您,但这不是工作由于
与sql\u mode=only\u full\u group\u by
不兼容而导致查询出错,因为我的查询应该与
only\u full\u group\u by
模式兼容。您确定您正在运行我的代码,完全没有修改吗?不,您的代码不起作用,所以我只是对其进行了一些更改。您的代码错误是:
SQLSTATE[42S02]:找不到基表或视图:1146表“temp.posts p”不存在…
@tim biegeleisenI不知道您的确切表名,我只知道您在问题中共享的信息。根据这些信息,我的答案是有效的。我的表名与您的代码完全相同,但我不知道问题出在哪里。