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

时间:2018-09-16 09:36:54

标签: mysql sql laravel laravel-5.7

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

我在一个名为import modules from 'MDBReact/module'; 的json列中获得了几种翻译,我只想选择没有针对特定语言(未设置或text)没有空翻译的记录。

我很难创建一个查询,如果该值设置为null,则该查询不返回记录。 以下是一些null列的json值,在此示例中,我需要一个仅返回第一条记录的查询,在该记录中,我对text值进行了翻译:

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

让我们尝试排除fr设置为null的记录。但也没有运气:

text: "{"de": "hallo", "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(); 的{​​{1}}值?

1 个答案:

答案 0 :(得分:0)

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

在我先前的查询尝试中,json列中的null值似乎不等于相同的null值。需要对其进行如下调整,然后才能起作用。基本上,首先需要使用以下代码将空值更改为相同的null值类型:

CAST("null" AS JSON)

然后将其放入查询中:

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