【问题标题】:CakePHP 4 JSON column values find or set aliasesCakePHP 4 JSON 列值查找或设置别名
【发布时间】:2020-07-27 23:29:02
【问题描述】:

所以我在 CakePHP 4 文档中注意到它们不是一种在 JSON mySQL 列中的 JSON 字段值上使用 find 的方法。每次我试图解释我在做什么时,它似乎在翻译中迷失了方向,所以我会解释我需要做什么:

根据 JSON 列值查找条目。所以在我的表中我有一个名为“additional_info”的 json 列,在“additional_info”中有多个 json 字段值,例如:{1:{org_id:"",name:"" 等。为了找到我需要,我需要能够根据 json 字段值 org_id 设置条件;如果我使用addition_info.org_id = 1设置条件,则显示1位于表json列中的所有记录。

我已经坚持了好几天了,还没有找到一个好的方法来完成这个。我在模型、行为、特征和集合中弄乱了 beforeFind。我相信我的问题可以通过我正在使用的一种方法解决,但如果没有任何关于此的示例将不胜感激!

如果可以的话,我希望在表格模型中设置它,以使更改全局化。(我不关心这个)

【问题讨论】:

  • 你为什么不把org_id做成一个普通的专栏?
  • 我正在修改一个已经创建并有数千条记录集的表。该选项在 atm 中并不完全可行。
  • 我希望有一种方法可以设置别名并将别名设置为我正在寻找的特定值。
  • 你用的是哪个mysql版本?

标签: php mysql json cakephp cakephp-4.x


【解决方案1】:

让我们学习如何选择字段作为别名:

https://book.cakephp.org/4/en/orm/query-builder.html#selecting-data

// Results in SELECT id AS pk, title AS aliased_title, body ...
$query = $articles->find();
$query->select(['pk' => 'id', 'aliased_title' => 'title', 'body']);

所以在我的表中,我有一个名为“additional_info”的 json 列,里面 "additional_info" 有多个json字段值

// $additional_info = {
//    1:{
//        org_id:"",
//        name:""
//    }};

此时,使用 JSON_EXTRACT() 修改 beforeFind 中的 SQL 语句的示例似乎是最好的方法。有人有这方面的例子吗?

// SELECT JSON_UNQUOTE(JSON_EXTRACT(additional_info, $.[1].org_id)) AS org_id

$query->select(['org_id' => 'JSON_UNQUOTE(JSON_EXTRACT(additional_info, $.[1].org_id))'])

地点:

// .. WHERE JSON_UNQUOTE(JSON_EXTRACT(additional_info, $.[1].org_id)) = `1`

$query->where(['JSON_UNQUOTE(JSON_EXTRACT(additional_info, $.[1].org_id))' => '1'])

要重用您的代码,您可以创建自定义查找器

https://book.cakephp.org/4/en/orm/retrieving-data-and-resultsets.html#custom-finder-methods

在行为中

https://book.cakephp.org/4/en/orm/behaviors.html#creating-a-behavior

【讨论】:

  • 我正在使用 cake4,必须像 ->where([ 'JSON_EXTRACT(payload, "$.is_active") = true']); 一样使用它,因为如果本来使用 ->where([JSON_EXTRACT(payload, "$.is_active") = true]),它会生成像 JSON_EXTRACT(payload, "$.is_echtdorsten") '1') 这样的 SQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2021-09-23
  • 2013-11-11
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2017-02-13
相关资源
最近更新 更多