如何在 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 条件?