Laravel 4.2 - 带有OR和反向参数的Eloquent WHERE子句

时间:2014-10-07 20:22:51

标签: php laravel-4 eloquent

我在Laravel 4.2中有Eloquent声明,看起来像这样

    $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做到这一点。我无法找到有关Eloquent使用的OR和AND语句的更多信息。

谢谢!

更新:

经过更多的研究后,我发现这似乎有效(仍在测试中)

$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();

我需要考虑这个缺点吗?

2 个答案:

答案 0 :(得分: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` = ?)

试试看它是否适用于Eloquent。

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();

它应该有用。

答案 1 :(得分:0)

由于提供了一个有效的解决方案以及他帮助我做出的努力,我将诺亚归功于解决方案。我最终使用了不同的解决方案..

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

在我的特定情况下,我只需要找到第一条记录,这对我有用

$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