【发布时间】: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();
-> 返回一个空结果。
我怎么能排除未设置或设置为 null 的 fr 值?
【问题讨论】:
-
这不是一个答案,但是,如果您使用的是 laravel,您可能需要使用 laravel 本地化 laravel.com/docs/5.6/localization
-
@HasanTıngır:我正在使用 spatie/laravel-translatable 包,我需要过滤翻译。
-
在每个查询中使用序列化、反序列化方法会降低应用程序的速度。我认为创建跨表的方式更好、更快且易于处理。 imgur.com/a/EsdpBEh
标签: mysql sql laravel laravel-5.7