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