PHP中MySQL查询结果转JSON时如何添加非数据库自定义字段
实现方法
注意事项
JSON 规范不允许同一对象内存在重复键,你示例的期望输出中两个RFC键的写法不符合标准,实际输出时后出现的键值会覆盖前一个,建议你给自定义的RFC字段设置独立的唯一键名(如custom_RFC)避免冲突。
代码修改方案
你只需要在拿到数据库查询结果$res后,给数组内的元素追加自定义字段即可,修改后代码如下:
$rfc = "R.F.C. ATP-880818-2P4"; // 提取自定义RFC的目标值,去掉前缀 $customRfc = trim(str_replace('R.F.C. ', '', $rfc)); $sql ="SELECT CONCAT(lov.ov,'-'," ; $sql .="lov.customerID,'-', pc.firstname, ' ', pc.lastname), suc.calle," ; $sql .="CONCAT('Monto: $',po.total_paid)," ; $sql .="CONCAT(suc.colonia,', C.P. ',suc.codigo_postal),suc.nombre, pc.email,pc.RFC,"; $sql .="CONCAT(pa.address1,'C.P. ',pa.postcode),pa.colony, pa.city,"; $sql .="CONCAT('Telefono: ',pa.phone), po.date_add from lista_ordenes_tarjeta lov " ; $sql .="INNER JOIN prstshp_customer pc ON lov.customerID = pc.customerID " ; $sql .="INNER JOIN prstshp_orders po ON lov.id_order = po.id_order " ; $sql .="INNER JOIN sucursales suc on lov.sitio = suc.sitio " ; $sql .="INNER JOIN prstshp_address pa on pc.id_customer = pa.id_customer " ; $sql .="where carrier = 'E-PAQ' and liberacion = 1 limit 1"; $res = DB::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); // 追加自定义字段,因为你用了limit 1只有一条数据,直接操作第一个元素即可 if (!empty($res)) { // 若需要将自定义字段放在对象最前面,使用array_merge合并 $res[0] = array_merge( ['custom_RFC' => $customRfc], // 这里键名可自行修改,不要和原有键重复 $res[0] ); } // 输出JSON,添加JSON_UNESCAPED_UNICODE避免中文/特殊字符乱码 echo json_encode($res, JSON_UNESCAPED_UNICODE);
多数据批量追加方案
如果你的查询没有加limit,返回多条数据,可以通过遍历批量添加字段:
foreach ($res as &$item) { $item['custom_RFC'] = $customRfc; } unset($item); // 释放引用,避免后续逻辑出错
优化建议
建议给SQL中的CONCAT计算字段添加别名,能大幅提升输出JSON的可读性,示例:
SELECT CONCAT(lov.ov,'-',lov.customerID,'-', pc.firstname, ' ', pc.lastname) AS order_identifier, suc.calle, CONCAT('Monto: $',po.total_paid) AS paid_amount, -- 其他字段同理加别名 po.date_add FROM -- 后续查询逻辑不变
内容的提问来源于stack exchange,提问作者Skuiz
相关产品推荐
相关产品推荐

