Laravel whereDoesntHave() - 多个OR条件

问题描述 投票:8回答:3

在Laravel 4.2中,我有一个名为Product的模型,与其他模型(如Country或Category)有多对多的关系。我想过滤掉“不完整”的产品,这意味着它们没有连接的国家或没有连接的类别。我可以使用whereDoesntHave()方法过滤掉一个关系。当我在一个查询中使用它两次时会创建AND条件,但我需要OR。我在API文档中找不到orWhereDoesntHave()方法。我不能将多个关系作为参数传递,因为它期望第一个参数是一个字符串。

我需要这样的东西: $products = Product::whereDoesntHave('categories')->orWhereDoesntHave('countries')->get();

有没有办法用多个qazxsw poi条件来实现qazxsw poi?

laravel relationship
3个回答
13
投票

您可以使用whereDoesntHave()并指定布尔运算符:

OR

实际上,如果你想在检查相关模型是否存在之前传递一个闭包来过滤相关模型,你只需要doesntHave。如果你想这样做,你可以传递闭包作为第三个参数:

$products = Product::doesntHave('categories')->doesntHave('countries', 'or')->get();

3
投票

使用

whereDoesntHave

Laravel源代码:

whereDoesnt有$products = Product::doesntHave('categories', 'or', function($q){ $q->where('active', false); })->doesntHave('countries', 'or')->get(); 内部调用Product::whereDoesntHave('categories')->doesntHave('countries', 'or')->get();


2
投票

从Laravel 5.5开始就有https://github.com/illuminate/database/blob/master/Eloquent/Builder.php#L654功能。

你可以像这样使用它

https://github.com/illuminate/database/blob/master/Eloquent/Builder.php#L628

从你的例子看,你似乎没有使用where子句,所以你可以使用

orWhereDoesntHave
© www.soinside.com 2019 - 2024. All rights reserved.