【问题标题】:Multiple where clause, Laravel多个where子句,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的答案。

【问题讨论】:

    标签: laravel eloquent laravel-7


    【解决方案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 变量具有正确的值,并在没有任何条件的情况下尝试查询以检查您的模型是否正常工作
    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2019-11-27
    • 2013-10-29
    • 2023-03-08
    • 2016-12-31
    • 2016-01-04
    相关资源
    最近更新 更多