Laravel whereDoesntHave() - multiple OR conditions

KazikM picture KazikM · Jan 21, 2015 · Viewed 29.3k times · Source

In Laravel 4.2 I have a model called Product with many-to-many relationshis to other models like Country or Category. I want to filter out products that are "incomplete", which means they have no connected countries or no connected categories. I can use whereDoesntHave() method to filter out one relation. When I use it two times in one query it creates AND condition, but I need OR. I can't find orWhereDoesntHave() method in API documentation. I can't pass multiple relations as arguments because it expects first argument to be a string.

I need something like this: $products = Product::whereDoesntHave('categories')->orWhereDoesntHave('countries')->get();

Is there any way to achive whereDoesntHave() with multiple OR conditions?

Answer

lukasgeiter picture lukasgeiter · Jan 21, 2015

You can use doesntHave and specify the boolean operator:

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

Actually you only need whereDoesntHave if you want to pass in a closure to filter the related models before checking if any of them exist. In case you want to do that you can pass the closure as third argument:

$products = Product::doesntHave('categories', 'or', function($q){
    $q->where('active', false);
})->doesntHave('countries', 'or')->get();