在 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 是一个空结果。
我怎么能排除未设置或设置为 null
的 fr
值?
我在类似 中找到了解决方案。对于具有初学者知识的人来说,这不是一个非常明显的问题。
在我之前的查询尝试中,json 列中的 null
值似乎与 null
值不同。需要按如下方式调整,然后就可以了。基本上,首先需要使用以下代码将空值更改为相同的 null
值类型:
CAST("null" AS JSON)
然后将其放入查询中:
parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> CAST("null" AS JSON)' )->get();
我似乎无法解决这个问题。
我在名为 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 是一个空结果。
我怎么能排除未设置或设置为 null
的 fr
值?
我在类似
在我之前的查询尝试中,json 列中的 null
值似乎与 null
值不同。需要按如下方式调整,然后就可以了。基本上,首先需要使用以下代码将空值更改为相同的 null
值类型:
CAST("null" AS JSON)
然后将其放入查询中:
parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> CAST("null" AS JSON)' )->get();