Использование имен столбцов при генерации JSON в Propel

Когда используешь toJSON() в ObjectCollection имена свойств всегда основаны на PHP-именах. Например:

Для колонки type_name свойство JSON становится TypeName, так далее.

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

0

Решение

Если вы не возражаете против использования 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
*/
2

Другие решения

Если вы хотите строго использовать вызов 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.

0

По вопросам рекламы [email protected]