web-dev-qa-db-ja.com

Laravel whereDoesntHave()-複数のOR条件

In Laravel 4.2国やカテゴリなどの他のモデルと多対多の関係を持つProductというモデルがあります。「不完全」な製品を除外したいので、接続されている国または接続されていないカテゴリ。whereDoesntHave()メソッドを使用して1つのリレーションを除外できます。1つのクエリで2回使用すると、AND条件が作成されますが、OR。APIドキュメントにorWhereDoesntHave()メソッドが見つかりません。最初の引数が文字列であると想定されているため、複数のリレーションを引数として渡すことができません。

次のようなものが必要です:$products = Product::whereDoesntHave('categories')->orWhereDoesntHave('countries')->get();

複数のOR条件でwhereDoesntHave()を達成する方法はありますか?

10
KazikM

doesntHaveを使用して、ブール演算子を指定できます。

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

実際には、クロージャを渡して関連モデルをフィルタリングしてから、それらのモデルが存在するかどうかを確認する場合にのみ、whereDoesntHaveが必要です。それをしたい場合は、クロージャを3番目の引数として渡すことができます。

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

Laravel 5.5なので、 orWhereDoesntHave 関数があります。

あなたはそれをこのように使うことができます

Product::Product::whereDoesntHave('categories', function($q){ //... })
                  ->orWhereDoesntHave('countries', function($q){//...})
                  ->get();

あなたの例から、where句を使用していないように見えるので、

Product::Product::doesntHave('categories')
                  ->ordoesntHave('countries')
                  ->get();
4
Adam

使用する

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 内部的に。

4
Jan P.