Laravel whereDoesntHave() - 多个 OR 条件
Laravel whereDoesntHave() - multiple OR conditions
在 Laravel 4.2 中,我有一个名为 Product 的模型,它与其他模型(如 Country 或 Category)具有多对多关系。我想过滤掉 "incomplete" 的产品,这意味着它们没有关联的国家或类别。我可以使用 whereDoesntHave()
方法来过滤掉一个关系。当我在一个查询中使用它两次时,它会创建 AND
条件,但我需要 OR
。我在 API 文档中找不到 orWhereDoesntHave()
方法。我不能将多个关系作为参数传递,因为它希望第一个参数是一个字符串。
我需要这样的东西:
$products = Product::whereDoesntHave('categories')->orWhereDoesntHave('countries')->get();
有什么方法可以在多个 OR
条件下实现 whereDoesntHave()
吗?
使用
Product::whereDoesntHave('categories')->doesntHave('countries', 'or')->get();
Laravel源代码:
whereDoesntHave https://github.com/illuminate/database/blob/master/Eloquent/Builder.php#L654
打电话
https://github.com/illuminate/database/blob/master/Eloquent/Builder.php#L628
内部。
您可以使用 doesntHave
并指定布尔运算符:
$products = Product::doesntHave('categories')->doesntHave('countries', 'or')->get();
实际上你只需要 whereDoesntHave
如果你想传入一个闭包来过滤相关模型,然后再检查它们是否存在。如果你想这样做,你可以将闭包作为第三个参数传递:
$products = Product::doesntHave('categories', 'or', function($q){
$q->where('active', false);
})->doesntHave('countries', 'or')->get();
因为 Laravel 5.5 有一个 orWhereDoesntHave 函数。
你可以这样使用
Product::whereDoesntHave('categories', function($q){ //... })
->orWhereDoesntHave('countries', function($q){//...})
->get();
从你的例子来看,你似乎没有使用 where 子句,所以你可以只使用
Product::doesntHave('categories')
->orDoesntHave('countries')
->get();
假设我们有作者和书籍,具有 1-n 关系——一个作者可以有一本或多本书。这是它在 app\Author.php:
中的样子
public function books()
{
return $this->hasMany(\App\Book::class, 'author_id');
}
现在,如果我们只想显示至少拥有一本书的作者怎么办?很简单,有个方法 has():
$authors = Author::has('books')->get();
同样,还有一个相反的方法——如果我们只想查询作者,而没有任何书籍呢?使用 doesnthave():
$authors = Author::doesnthave('books')->get();
它不仅方便,而且超级容易阅读和理解,即使您不是 Laravel 开发人员,对吧?
在 Laravel 4.2 中,我有一个名为 Product 的模型,它与其他模型(如 Country 或 Category)具有多对多关系。我想过滤掉 "incomplete" 的产品,这意味着它们没有关联的国家或类别。我可以使用 whereDoesntHave()
方法来过滤掉一个关系。当我在一个查询中使用它两次时,它会创建 AND
条件,但我需要 OR
。我在 API 文档中找不到 orWhereDoesntHave()
方法。我不能将多个关系作为参数传递,因为它希望第一个参数是一个字符串。
我需要这样的东西:
$products = Product::whereDoesntHave('categories')->orWhereDoesntHave('countries')->get();
有什么方法可以在多个 OR
条件下实现 whereDoesntHave()
吗?
使用
Product::whereDoesntHave('categories')->doesntHave('countries', 'or')->get();
Laravel源代码:
whereDoesntHave https://github.com/illuminate/database/blob/master/Eloquent/Builder.php#L654 打电话 https://github.com/illuminate/database/blob/master/Eloquent/Builder.php#L628 内部。
您可以使用 doesntHave
并指定布尔运算符:
$products = Product::doesntHave('categories')->doesntHave('countries', 'or')->get();
实际上你只需要 whereDoesntHave
如果你想传入一个闭包来过滤相关模型,然后再检查它们是否存在。如果你想这样做,你可以将闭包作为第三个参数传递:
$products = Product::doesntHave('categories', 'or', function($q){
$q->where('active', false);
})->doesntHave('countries', 'or')->get();
因为 Laravel 5.5 有一个 orWhereDoesntHave 函数。
你可以这样使用
Product::whereDoesntHave('categories', function($q){ //... })
->orWhereDoesntHave('countries', function($q){//...})
->get();
从你的例子来看,你似乎没有使用 where 子句,所以你可以只使用
Product::doesntHave('categories')
->orDoesntHave('countries')
->get();
假设我们有作者和书籍,具有 1-n 关系——一个作者可以有一本或多本书。这是它在 app\Author.php:
中的样子 public function books()
{
return $this->hasMany(\App\Book::class, 'author_id');
}
现在,如果我们只想显示至少拥有一本书的作者怎么办?很简单,有个方法 has():
$authors = Author::has('books')->get();
同样,还有一个相反的方法——如果我们只想查询作者,而没有任何书籍呢?使用 doesnthave():
$authors = Author::doesnthave('books')->get();
它不仅方便,而且超级容易阅读和理解,即使您不是 Laravel 开发人员,对吧?