如何在 Laravel 中将两个分组的 whereIn 子句与 Where not 组合

Posted

技术标签:

【中文标题】如何在 Laravel 中将两个分组的 whereIn 子句与 Where not 组合【英文标题】:How to combine two grouped whereIn clauses with Where not in Laravel 【发布时间】:2021-07-27 02:02:07 【问题描述】:

我尝试在 Laravel eloquent 中使用以下 mysql 子句:

SELECT * FROM pages
INNER JOIN page_translations as pt
ON pages.id = pt.page_id
WHERE NOT (page_id IN (93) AND locale IN ('de', 'en'));

但是,由于“WHERE NOT”,我无法实现它,相反,只使用 WHERE 没有问题。

所以我走了这么远:

Page::join('page_translations as pt', 'pages.id', '=', 'pt.page_id')
            ->where(function($query) use ($homes) 
                $query->whereIn('pages.id', $homes->values()->toArray());
                $query->whereIn('locale', $homes->keys()->toArray());
            )
            ->get();

我试图通过使用 'whereRaw' 或 Raw 子句来解决它,但这并没有真正帮助。

如果有人可以告诉我如何将此 SQL 查询带到 Laravel Eloquent,那就太好了。

【问题讨论】:

你为什么不使用关系? 你的意思是你要使用whereNotIn?? 我需要对项目进行排序,这就是我使用联接的原因 【参考方案1】:

尝试使用whereNotIn 执行查询:

Page::join('page_translations as pt', 'pages.id', '=', 'pt.page_id')
            ->where(function($query) use ($homes) 
                $query->whereNotIn('pages.id', $homes->values()->toArray());
                $query->whereNotIn('locale', $homes->keys()->toArray());
            )
            ->get();

【讨论】:

嗨,我试过了,但结果并不正确。 locale 列在 page_translations 中对吗? 我认为你写错了SQL语句。请执行此语句并告诉我您是否想要此结果? SELECT * FROM pages INNER JOIN page_translations as pt ON pages.id = pt.page_id and pages.id not in (2) and locale not in ('de', 'en'); 【参考方案2】:

好的,虽然我最终在途中使用了不同的方法,但我想出了如何使用上述 sql 查询进行雄辩的查询,因此解决方案实际上非常简单:

Page::join('page_translations as pt', 'pages.id', '=', 'pt.page_id')
        ->whereRaw("not (page_id in (?) and locale in (?)", ,[93], ['de', 'en'])
        ->get();

【讨论】:

以上是关于如何在 Laravel 中将两个分组的 whereIn 子句与 Where not 组合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 的 DB 查询中编写两个 where 条件?

Laravel参数分组(和/或位置)

如何在laravel中将两级数组转换为一个级别数组

是否可以在 Laravel 8 中按 from 和 to user id 分组

如何在laravel中将主键本身设置为外键?

如何在 Laravel 中将连接结果作为对象数组获取?