当前位置: 首页 > 知识库问答 >
问题:

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

狄楷
2023-03-14

我在Laravel 4.2中有一个雄辩的陈述,看起来像这样

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

然后,如果$user\u message\u 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)

我怎么能用雄辩的语言做到这一点呢。我找不到更多关于或雄辩的陈述。

谢谢

更新:

经过更多的寻找,我发现这似乎工作(仍在测试很多)

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

$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个答案

谈灵均
2023-03-14

我把这个解决方案归功于诺亚,因为他提供了一个有效的解决方案,并努力帮助我。然而,我最终使用了不同的解决方案...

$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视频中找到了一个类似的解决方案。我偶然发现了这个带有OR和where子句的过于夸张的SQL查询

谷善
2023-03-14

在雄辩中做这件事可能非常复杂,但这正是使用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();

它应该工作。

 类似资料:
  • 问题内容: 我怎么说 对于更复杂的查询,我应该使用原始SQL吗? 问题答案: 利用参数分组(Laravel4.2)。以您的示例为例:

  • 我尝试从带有多个where和/或子句的表中获得结果。

  • 问题内容: 对于拍摄特定的对象我有目标的一个在线竞赛 用户 上传 图片 的 对象 ,其中对象具有 类别 和 子类别 。 用户的仪表板应如下所示: 为了能够在适当的循环中输出图片,我在模型之间安装了 hasMany 关系。所以我可以通过以下方式获得具有方便层次结构的对象 问题: 对于仪表板,我当然只希望来自某个用户的图像: Pictures 模型包含一个 user_id 字段。我可以直接获取用户的图

  • 我有以下雄辩的模型: 用户id 邮政编码 评论| id |发布| id |用户| id 使用eloquent,如何获取特定用户尚未发表评论的所有帖子? 到目前为止,我试过: 在模范岗位: 在模型注释中:

  • 问题内容: 我正在尝试使用Eloquent在数据库种子期间执行以下查询: 这是我在Eloquent中的实现: 尽管第一个查询始终返回完整结果,但Eloquent等价项始终为表的和字段以外的所有内容返回空元素。由于和模型都是工匠生成的骨架,因此我无所适从。 例如: 这是当我对种子(最初由Faker生成)的第一个口才查询dd()时输出的数组: 问题答案: 可以通过指定特定表中所需的特定列名来解决,如下

  • 问题内容: 认为我是Laravel初学者 目标是:我有两个列,现在我需要在表中以同一行作为前缀。 例如(工作)…我有Mysql 和输出是 ID 我需要用laravel雄辩的方式来表示,因为这里Component是Model name。所以我尝试了类似的东西 但这不起作用。 我认为是因为语法错误。 请帮助我正确的语法。使用 。 注意:我进行了上述查询,将其称为Internet上可用的查询。 问题答案