多个where子句,Laravel

Posted

技术标签:

【中文标题】多个where子句,Laravel【英文标题】:Multiple where clause, Laravel 【发布时间】:2020-09-28 07:00:24 【问题描述】:

我尝试使用 2 个 where 子句进行查询,但我得到一个错误的响应,不知道为什么。

$history = AnswerHistory::where('question_id', '=', $id)
     ->where(function ($query) 
            $query->where('answer_type', '!=', "skipped");
      )
      ->get();

对于数据库中的特定 $id,我有 5 行,4 行带有 answer_type = 'skipped,但 5 行是 NULL

如果我删除第二个,我的响应是空的,我得到 5 个项目,其中包括 "skipped" 答案。

想要的响应是 1 行,其中answer_type != 'skipped'

PS。我也试过here的答案。

【问题讨论】:

【参考方案1】:

问题是,null 的 varchar 是 null 而不是带有值的 varchar。所以不能用=!= 'string' 来检查。所以你必须检查 answer_type 是 != 跳过还是 null

$history = AnswerHistory::where('question_id', '=', $id)
    ->where(function ($query) 
        $query->where('answer_type', '!=', "skipped")
            ->orWhereNull('answer_type');
    )
    ->get();

【讨论】:

我现在确实尝试过,并且有效,但我不知道为什么,直到现在,谢谢! null 不是字符串,因此您无法在 sql 中使用 = 或 != 检查它【参考方案2】:

您可以将查询更改为像这样的多个 where 条件

$history = AnswerHistory::where([['question_id', '=', $id],['answer_type','<>','skipped']])
                        ->get()
                        ->toArray();

并将!= 替换为&lt;&gt;

希望对你有帮助

【讨论】:

@Beusebiu 你自己告诉过你有 5 行,其中 4 行被跳过,第 5 行是 NULL 所以在这种情况下答案是正确的人 我上传了一张图片。以 id 146 为例。在我的回复中,我只需要那些即使为 null 也未“跳过”的代码,使用此代码我得到 null .. @Beusebiu 查询是正确的,但请确保您的 $id 变量具有正确的值,并在没有任何条件的情况下尝试查询以检查您的模型是否正常工作

以上是关于多个where子句,Laravel的主要内容,如果未能解决你的问题,请参考以下文章

TypeORM查找where子句,如何在多个参数中添加where

具有多个 where 子句的 Linq to Datatable

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

Haskell:具有多个***绑定的“where”子句?

如何在 mysqli 准备语句中使用多个内部连接和多个 WHERE 子句? [复制]