【问题标题】:Right way to select not empty values in a json column with Laravel > 5.6?在 Laravel > 5.6 的 json 列中选择非空值的正确方法?
【发布时间】:2018-09-16 18:28:37
【问题描述】:

我似乎无法理解这一点。

我在名为 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();

-> 返回一个空结果。

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

【问题讨论】:

  • 这不是一个答案,但是,如果您使用的是 laravel,您可能需要使用 laravel 本地化 laravel.com/docs/5.6/localization
  • @HasanTıngır:我正在使用 spatie/laravel-translatable 包,我需要过滤翻译。
  • 在每个查询中使用序列化、反序列化方法会降低应用程序的速度。我认为创建跨表的方式更好、更快且易于处理。 imgur.com/a/EsdpBEh

标签: mysql sql laravel laravel-5.7


【解决方案1】:

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

似乎 json 列中的 null 值与我之前的查询尝试中的 null 值不同。需要进行如下调整,然后才能正常工作。基本上空值需要先改成相同的null值类型,代码如下:

CAST("null" AS JSON)

然后将其放入查询中:

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

【讨论】:

  • 嗨,我怎么能把 OR 条件放在不是 NULL 或 ''(空字符串)的地方,我试过 CAST("null" AS JSON), CAST("''" AS JSON)但它不起作用..我想在 json 部分中返回不为 null 或空字符串的值。有可能的?我对stackoverlfow线程也很困惑如何做到这一点
猜你喜欢
  • 2022-01-07
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2019-07-19
相关资源
最近更新 更多