2016-02-08 1 views
0

При использовании toJSON() на ObjectCollection имена свойств всегда основаны на именах PHP. Например:Использование имен столбцов при генерации JSON в Propel

Для столбца type_name свойство JSON становится TypeName и т.д.

Есть ли способ, чтобы сделать Propel использовать имя поля/столбца вместо этого?

ответ

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 для вывода массива с имена столбцов.

Документы изумительны, но они довольно запутывают навигацию. Я нашел следующий комментарий от одной из сгенерированных моделей в моем проекте. Это для версии [email protected], которую я использую; обратите внимание, что может отличаться в вашей версии. (я хотел бы предложить, глядя на документы для более формального руководства, но вы можете взглянуть на ваши модели тоже.)

/** 
* 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 
*/ 
+0

Спасибо за ответ! Это действительно приводит к правильному выводу. Однако; Он не использует встроенную функцию 'toJSON'. – Cethy

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_decode объект JSON и только заменить ключи, но если вы не хотите использовать json_encode, я не думаю, что вы бы хотели использовать json_decode.

@ Ответ Cezille07 является наиболее правильным в этом случае. Мой ответ в основном заключается в том, чтобы показать, как TableMap/ColumnMaps можно использовать для последующей обработки, чего я не знал о начале работы с Propel.

Смежные вопросы