0

在 ObjectCollection 上使用toJSON()时,属性的名称始终基于 PHP 名称。例如:

对于列type_name,JSON 属性变为TypeName等。

有没有办法让 Propel 使用字段/列的名称来代替?

4

2 回答 2

2

如果您不介意使用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
 */
于 2016-03-03T08:04:15.210 回答
0

如果您只想严格使用 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_decodeJSON 对象并且只替换键,但如果你不想使用json_encode,我不认为你想使用json_decode.

在这种情况下,@Cezille07 的回答是最正确的。我的回答主要是展示如何使用 TableMap/ColumnMaps 进行后期处理,这是我刚开始使用 Propel 时所不知道的。

于 2016-03-09T21:02:07.650 回答