2017-09-26 14 views
0

いくつかのパラメータに基づいてユーザーを取得するクエリがあります。Laravel where節が一連のorwhereの後で動作しない

$users = User::where(function($query) use($queryTags_userIDs) { 
    $query->whereIn('id', $queryTags_userIDs); 
})->orWhere(function($query) use($queryImageTitles_userIDs) { 
    $query->whereIn('id', $queryImageTitles_userIDs); 
})->orWhere('username', 'LIKE', "%{$query}%") 
    ->orWhere('keywords', 'LIKE', "%{$query}%")  
    ->orWhere('profile_text', 'LIKE', "%{$query}%") 
    ->orWhere('tagline', 'LIKE', "%{$query}%") 
    ->where('role', 2) 
    ->orderBy('last_login', 'desc') 
    ->paginate(15); 

今、このすべてがうまくいきます。この部分を除き

:代わりの役割は2であるユーザーを取得する

->where('role', 2) 

、それはEVERY役割のユーザーを取得します。

しかし、いくつかのorWheresを取り除くとうまくいくでしょう。

私はこれらの3 orWheresを取り除く場合:

->orWhere('keywords', 'LIKE', "%{$query}%")  
->orWhere('profile_text', 'LIKE', "%{$query}%") 
->orWhere('tagline', 'LIKE', "%{$query}%") 

、それが唯一の事実役割2.をユーザーにフェッチを開始し、これら3特定orWheresは問題に

を引き起こし、何らかの理由で、あります私は

$users = User::where('username', 'LIKE', "%{$query}%") 
    ->orWhere('keywords', 'LIKE', "%{$query}%")  
    ->where('role', 2) 
    ->orderBy('last_login', 'desc') 
    ->paginate(7); 

にクエリを削減した場合、それはまだ役割の外からユーザーを取得します。2.

しかし、それはこのに切り替えした場合:

$users = User::where('username', 'LIKE', "%{$query}%") 
    ->where('role', 2) 
    ->orderBy('last_login', 'desc') 
    ->paginate(7); 

、それが唯一の役割2.

からユーザーを取得し、突然のすべてが、ですが、なぜでしょうか?これが意味をなさないので、私は何かを明らかにしていないように感じる。

EDIT

BassemエルHachemさんを受けて、私は、クエリの最初に役割= 2を入れました。しかし、それはまだ動作しません。ここでは変更後のクエリは次のとおりです。

usersどこrole =と(id)、、、、、 、(中???????)または(id中(SELECT * FROM? ( ?、?、?、?))または(usernameLIKE?または)であることを特徴とする請求項1に記載の方法。 ???SQLでクエリはこれですので、だlast_login DESC」

+0

新しい回答をお試しください。他の 'どこ 'はすべて' OR'ですか、別の必須の場所ですか? –

+0

新しい回答が動作します。 –

答えて

1

によって、LIKEまたは profile_text LIKEまたはtagline LIKE)順序:

SQLで ANDオペレータは、乗算のようなものです
WHERE keywords like '%...%' OR profile_text LIKE '%...%' 
OR tagline LIKE '%...%' AND role=2 

、それは本当にあなたのクエリを意味括弧をされて追加されます。

WHERE keywords like '%...%' OR profile_text LIKE '%...%' 
OR (tagline LIKE '%...%' AND role=2) 

ので特定の行だけ(ものに適用されているrole=2フィルタここではtagline LIKE '%...%')。行がkeywords like '%...%' OR profile_text LIKE '%...%'の場合、roleは任意の値にすることができます。これはあなたが望むものではありません。

roleのフィルタリングをuserに直接適用する必要があります。これはまた、間違いなく効率に役立ちます。

$users = User::where('role', 2) 
    ->where(function($q) use($queryTags_userIDs,$queryImageTitles_userIDs,$query) { 
     $q->whereIn('id', $queryTags_userIDs) 
     ->orWhereIn('id', $queryImageTitles_userIDs) 
     ->orWhere('username', 'LIKE', "%{$query}%") 
     ->orWhere('keywords', 'LIKE', "%{$query}%")  
     ->orWhere('profile_text', 'LIKE', "%{$query}%") 
     ->orWhere('tagline', 'LIKE', "%{$query}%"); 
    })->orderBy('last_login', 'desc') 
    ->paginate(15); 

結果が不明なので、SQL構文でクエリを表示することをお勧めします。これは、paginate(15)toSql()およびdd()に置き換えることによって行うことができます。

+0

動作しません。私はtoSql()diedumpで自分の応答を編集しました。 –

関連する問題