2014-10-07 67 views
0

我在Laravel 4.2,看起來像這樣Laravel 4.2 - 機鋒WHERE子句與OR和反向參數

$user_message_block = Message::where('responder_id', '=', Auth::user()->id) 
         ->where('user_id', '=', $user->id)->first(); 

雄辯的發言之後,如果$user_message_block不存在,我也有,檢查是否有反向的情況和我不喜歡這樣......

if(!$user_message_block){ 
     $user_message_block = Message::where('responder_id', '=', Auth::user()->id) 
          ->where('user_id', '=', $user->id)->first(); 
    } 

我真正想要做的是運行檢查一次兩種情況下單個查詢..

在僞è上的表達,我需要這樣的:

$user_message_block = Message::where('responder_id', '=', Auth::user()->id, 
           'AND', 'user_id', '=', $user->id, 
           'OR', 'responder_id', '=', $user->id, 
           'AND', 'user_id', '=', Auth::user()->id)->first(); 

所以基本上我需要

SELECT Message where (responder_id=x AND user_id=y) OR where (responder_id=y AND user_id=x) 

我怎麼能做到這一點使用侃侃而談。我無法找到更多關於與Eloquent一起使用的OR和AND語句。

謝謝!

UPDATE:

經過尋找,我發現,這似乎是工作

$user_message_block = 
     Message::where(['responder_id' => Auth::user()->id, 'user_id' => $user->id]) 
      ->orWhere(['user_id' => Auth::user()->id, 'responder_id' => $user->id]) 
      ->first(); 

OR

$user_message_block = 
     Message::where(['responder_id' => Auth::user()->id, 'user_id' => $user->id]) 
      ->orWhere(['user_id' => Auth::user()->id, 'responder_id' => $user->id]) 
      ->get(); 

有什麼缺點(有很多還在測試)到這一點,我需要考慮?

回答

4

在Eloquent中執行操作可能非常複雜,但這確實是您使用Laravel的查詢生成器所需的,而不會恢復爲原始SQL。

DB::table('messages') 
     ->where(function($query) 
     { 
      $query->where('responder_id', '=', 'x') 
      ->where('user_id', '=', 'y'); 
     }) 
     ->orWhere(function($query) { 
      $query->where('responder_id', '=', 'y') 
        ->where('user_id', '=', 'x'); 
     }) 
     ->get(); 

這是我從運行就可以了toSql()得到:

select * from `messages` where (`responder_id` = ? and `user_id` = ?) or (`responder_id` = ? and `user_id` = ?) 

試試這個,看看它是否有雄辯的作品。

Message::where(function($query) { 
    $query->where('responder_id', '=', 'x') 
      ->where('user_id', '=', 'y'); 
})->orWhere(function($query) { 
    $query->where('responder_id', '=', 'y') 
      ->where('user_id', '=', 'x'); 
})->get(); 

它應該工作。

+0

mmmm ,,我剛剛發現了一些關於雄辯的東西似乎工作,我會更新我的問題。它看起來像我可以傳遞信息的數組,並使用 - >或有雄辯的條款。 – GRowing 2014-10-07 20:30:47

+0

如果已經爲您提供瞭解決方案,請接受它作爲答案。 – 2014-10-07 21:09:29

+0

我正在使用上面發佈的解決方案。稍後我會對此進行測試,看看是否有任何明顯的差異使得此解決方案更加可行。 – GRowing 2014-10-07 21:26:04

0

由於提供了一個可行的解決方案和他爲幫助我而付出的努力,我相信諾亞的解決方案。我沒有結束但是,在使用不同的解決方案..

$user_message_block = 
    Message::where(['responder_id' => 'x', 'user_id'  => 'y']) 
      ->orWhere(['user_id' => 'x', 'responder_id' => 'y']) 
      ->get(); 

在我speciffic情況下,我只需要在第一個記錄發現,所以這對我的作品

$user_message_block = 
    Message::where(['responder_id' => 'x', 'user_id'  => 'y']) 
      ->orWhere(['user_id' => 'x', 'responder_id' => 'y']) 
      ->first(); 

我只想說,等我找到了解決方案與Alex在phpacademy視頻中的類似。而我也偶然發現了這一點Laravel eloquent SQL query with OR and AND with where clause