使用Laravel> 5.6在json列中选择非空值的正确方法?

问题描述 投票:0回答:1

我似乎无法绕过这个。

我在一个名为text的json列中得到了几个翻译,我想只选择那些对于特定语言没有空翻译的记录(未设置,或者不是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();

- >返回一个空结果。

我怎么能排除未设置或设置为frnull值?

mysql sql laravel laravel-5.7
1个回答
0
投票

我在类似的Stackoverflow thread找到了解决方案。对于有初学者知识的人来说,这不是一个非常明显的问题。

似乎json列中的null值在我之前的查询尝试中没有计算到相同的null值。它需要调整如下,然后它的工作原理。基本上,需要首先使用以下代码将null值更改为相同的null值类型:

CAST("null" AS JSON)

然后将其放入查询中:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> CAST("null" AS JSON)' )->get();
© www.soinside.com 2019 - 2024. All rights reserved.