In Laravel 4.2国やカテゴリなどの他のモデルと多対多の関係を持つProductというモデルがあります。「不完全」な製品を除外したいので、接続されている国または接続されていないカテゴリ。whereDoesntHave()
メソッドを使用して1つのリレーションを除外できます。1つのクエリで2回使用すると、AND
条件が作成されますが、OR
。APIドキュメントにorWhereDoesntHave()
メソッドが見つかりません。最初の引数が文字列であると想定されているため、複数のリレーションを引数として渡すことができません。
次のようなものが必要です:$products = Product::whereDoesntHave('categories')->orWhereDoesntHave('countries')->get();
複数のOR
条件でwhereDoesntHave()
を達成する方法はありますか?
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();
Laravel 5.5なので、 orWhereDoesntHave 関数があります。
あなたはそれをこのように使うことができます
Product::Product::whereDoesntHave('categories', function($q){ //... })
->orWhereDoesntHave('countries', function($q){//...})
->get();
あなたの例から、where句を使用していないように見えるので、
Product::Product::doesntHave('categories')
->ordoesntHave('countries')
->get();
使用する
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 内部的に。