在 Laravel > 5.6 的 json 列中 select 不是空值的正确方法?

Right way to select not empty values in a json column with Laravel > 5.6?

我似乎无法解决这个问题。

我在名为 text 的 json 列中得到了多个翻译,我只想 select 那些没有针对特定语言的空翻译的记录(未设置,或者不是 null)。

如果值设置为 null,我很难创建没有 return 记录的查询。 这里有一些 text 列 json 值,我需要一个查询 return 只是本例中的第一条记录,其中我有 fr 值的翻译:

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"
text: "{"de": "und"}"

这是我到目前为止尝试过的方法:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") is not null' )->get();

-> returns

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"

无赖。它跳过根本没有设置 fr 的记录(没关系),但保留 selecting fr 设置为 null 的记录。所以,我需要调整查询以排除 "fr": null

的记录

让我们逐步解决这个问题。当我尝试正匹配搜索这样的字符串时:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") = "merci"' )->get();

-> returns

text: "{"de": "danke", "fr": "merci"}"

没错。现在,找到一种方法来切换它并排除带有 "fr": null 的记录似乎很容易。但没有运气。

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> "merci"' )->get();

-> returns 只有设置了fr但不等于merci的记录。它会跳过未设置 fr 的记录。

text: "{"de": "hallo", "fr": null}"

让我们尝试排除 fr 设置为空的记录。但也不走运:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> "null"' )->get();

-> returns

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"

或者,

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> null' )->get();

-> return 是一个空结果。

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

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

在我之前的查询尝试中,json 列中的 null 值似乎与 null 值不同。需要按如下方式调整,然后就可以了。基本上,首先需要使用以下代码将空值更改为相同的 null 值类型:

CAST("null" AS JSON)

然后将其放入查询中:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> CAST("null" AS JSON)' )->get();