Кажется, я не могу обернуться вокруг этого.
Я получил несколько переводов в столбце json с именем text
, и я хочу выбрать только те записи, которые не имеют пустых переводов для определенного языка (не установлен или не null
).
Я изо всех сил пытаюсь создать запрос, который не возвращает запись, если установлено значение null
.
Вот некоторые text
значения столбца json, и мне нужен запрос, который возвращает только первую запись в этом примере, где у меня есть перевод для значения fr
:
text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"
text: "{"de": "und"}"
Вот что я попробовал:
parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") is not null' )->get();
-> возвращает
text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"
Облом. Он пропускает запись, где fr
вообще не установлен (это нормально), но продолжает выбирать запись, где fr
имеет значение null
. Итак, мне нужно настроить запрос, чтобы исключить запись с "fr": null
Давайте подойдем к этому шаг за шагом. Когда я пытаюсь найти положительное совпадение, ищите строку, подобную этой:
parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") = "merci"' )->get();
-> возвращает
text: "{"de": "danke", "fr": "merci"}"
Это правильно. Теперь, казалось бы, легко найти способ изменить это и исключить записи с "fr": null
. Но не повезло.
parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> "merci"' )->get();
-> возвращает только запись, в которой установлена fr
, но не равна merci
. Он пропускает запись, где fr
не установлено.
text: "{"de": "hallo", "fr": null}"
Попробуем исключить записи, в которых для fr установлено значение null. Но тоже не повезло:
parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> "null"' )->get();
-> возвращает
text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"
Или,
parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> null' )->get();
-> возвращает пустой результат.
Как, черт возьми, я могу исключить fr
значения, которые не установлены или установлены на null
?