Несколько предложений where, Laravel

Я пытаюсь выполнить запрос с двумя предложениями 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. Я также попробовал ответ из здесь.

введите здесь описание изображения


person Beusebiu    schedule 09.06.2020    source источник


Ответы (2)


Проблема в том, что varchar, который является null, является null, а не varchar со значением. Поэтому его нельзя проверить с помощью = или != 'string'. Итак, вы должны проверить, является ли answer_type != пропущенным или нулевым

$history = AnswerHistory::where('question_id', '=', $id)
    ->where(function ($query) {
        $query->where('answer_type', '!=', "skipped")
            ->orWhereNull('answer_type');
    })
    ->get();
person julianstark999    schedule 09.06.2020
comment
На самом деле я попробовал это прямо сейчас, и это работает, но я до сих пор не знал, почему, спасибо! - person Beusebiu; 09.06.2020
comment
null не является строкой, поэтому вы не можете проверить ее с помощью = или != в sql - person julianstark999; 09.06.2020

Вы можете изменить свой запрос для нескольких условий, подобных этому

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

И замените != на <>

Я надеюсь, что это полезно

person Khalid Khan    schedule 09.06.2020
comment
@Beusebiu, ты сам сказал, что у тебя 5 строк, из которых 4 пропущены, а 5-я равна NULL, так что в этом случае ответ правильный, чувак. - person Khalid Khan; 09.06.2020
comment
Я загружаю img. с примером для идентификатора 146. В моем ответе мне нужны только те, которые не «пропущены», даже если они равны нулю, с этим кодом я получаю ноль.. - person Beusebiu; 09.06.2020
comment
Запрос @Beusebiu правильный, но убедитесь, что ваша переменная $id имеет правильное значение, и попробуйте выполнить запрос без каких-либо условий, чтобы проверить, правильно ли работает ваша модель. - person Khalid Khan; 09.06.2020