我的数据库中有一个包含多个值的列,以下是这些值的示例:
SQL列名为extra_fields
,类型为text
[{"id":"2","value":"Ser mayor de edad"},
{"id":"3","value":"Prueba de extension"},
{"id":"4","value":"99.999.99"},
{"id":"5","value":"10"}}
我在PHP函数中有这个,我得到了我想要修改的值:
$db = $this->getDbo();
$query = 'SELECT * FROM #__k2_items where id='.$item_id;
$db->setQuery($query);
$resultado = $db->loadObject();
$campos_extra = json_decode($resultado->extra_fields);
$num_max_cup_descargar = $campos_extra[2]->value;
$num_max_cup_canjear = $campos_extra[3]->value;
$num_max_cup_x_dia = $campos_extra[4]->value;
$num_max_cup_uti_canje_x_user_dia = $campos_extra[5]->value;
$num_max_cup_desc_user = $campos_extra[6]->value;
我正在尝试更新其中一个值,我该怎么做?
编辑:我正在使用MySQL数据库。
答案 0 :(得分:1)
您将无法仅使用SQL更新文本列中某些值的子字符串。 MySQL并不关心你是否有一个字符串化的JSON对象或莎士比亚戏剧的一部分。您必须通过在PHP中执行此更新此值:
$ campos_extra = json_decode($ resultado-> extra_fields);
$num_max_cup_descargar = $campos_extra[2]->value; $num_max_cup_canjear = $campos_extra[3]->value; $num_max_cup_x_dia = $campos_extra[4]->value; $num_max_cup_uti_canje_x_user_dia = $campos_extra[5]->value; $num_max_cup_desc_user = $campos_extra[6]->value; $num_max_cup_desc_user = "changedUser"; $campos_extra[6]->value = $num_max_cup_desc_user;
$ campos_extra_updated = json_encode($ campos_extra);
将$ campos_extra_updated放入数据库的该字段中。
答案 1 :(得分:1)
为了动态支持此类查询,您可以使用两种不同的方法:
以编程方式操作数据
嗯,这很简单 - 很好地总结它意味着你必须编写逻辑来端到端地操作数据。这样做的一大好处是,您的解决方案不依赖于底层数据库引擎。
使用特定于数据库的扩展程序
大多数当前的RDBMS引擎都支持存储在表中的动态列或数组数据。在MySQL的情况下,有一个名为MariaDB的开源克隆支持这种机制 - 请参阅Dynamic Columns in MariaDB的文档。
使用PostgreSQL,您可以选择存储JSON and manipulate that directly (limited),array column,composite types(如果您的属性定义良好)或hstore来创建无模式设计。
以上所有实现都有其优点和缺点,所以你必须明智地选择。但是所有这些都带来了对列的索引(以及因此查询),一些常规SQL支持等的附加好处。明智地选择: - )