[英]Using column names when generating JSON in Propel
在ObjectCollection上使用toJSON()
时,属性的名称始终基于PHP名称。 例如:
对于列type_name
,JSON属性变为TypeName
等。
有没有办法让Propel使用字段/列的名称呢?
如果您不介意使用json_encode
,请尝试将对象的toArray()
与参数一起使用:
use Map\AuditTableMap as TableMap;
$something = new Something();
$something->setSomeColumnValue("value");
echo json_encode($something->toArray(SomethingMap::TYPE_FIELDNAME));
输出:
{"some_column_value": "value"}
换句话说,使用参数<ObjectName>Map::TYPE_FIELDNAME
输出带有列名的数组。
这些文档很棒,但是浏览起来却很混乱。 我从我的项目中生成的模型之一中发现以下注释。 这是我正在使用的版本2.0@dev
。 请注意, 您的版本可能有所不同。 (我建议您查看文档以获取更多正式指导,但您也可以浏览一下自己的模型。)
/**
* Exports the object as an array.
*
* You can specify the key type of the array by passing one of the class
* type constants.
*
* @param string $keyType (optional) One of the class type constants TableMap::TYPE_PHPNAME, TableMap::TYPE_CAMELNAME,
* TableMap::TYPE_COLNAME, TableMap::TYPE_FIELDNAME, TableMap::TYPE_NUM.
* Defaults to TableMap::TYPE_PHPNAME.
* @param boolean $includeLazyLoadColumns (optional) Whether to include lazy loaded columns. Defaults to TRUE.
* @param array $alreadyDumpedObjects List of objects to skip to avoid recursion
* @param boolean $includeForeignObjects (optional) Whether to include hydrated related objects. Default to FALSE.
*
* @return array an associative array containing the field names (as keys) and field values
*/
如果只想严格使用toJSON调用,则必须对字符串进行一些后处理操作,因为toJSON方法所允许的唯一选项是包含或不包含延迟加载的列。
$something = new Something();
$something->setSomeColumnValue("value");
$json = $something->toJSON();
$tableMap = \Propel::getDatabaseMap()->getTableMap('Something');
$columnMaps = $tableMap->getColumns();
$phpNames = array();
$columnNames = array();
foreach ($columnMaps as $columnMap) {
$phpNames[] = '"' . $columnMap->getPhpName() . '"';
$columnNames[] = '"' . $columnMap->getColumnName() . '"';
}
$json = str_replace($phpNames, $columnNames, $json);
此代码的一个警告是,如果该值与您的列名之一完全匹配,它将被替换。 消除此问题的唯一方法是对JSON对象进行json_decode
并仅替换键,但是如果您不想使用json_encode
,那么我不希望您使用json_decode
。
在这种情况下,@ Cezille07的答案是最正确的。 我的回答主要是显示如何将TableMap / ColumnMaps用于后期处理,这是我从Propel开始时不知道的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.