Добавление пользовательских столбцов в модель Propel?
На данный момент я использую следующий запрос:
$claims = ClaimQuery::create('c')
->leftJoinUser()
->withColumn('CONCAT(User.Firstname, " ", User.Lastname)', 'name')
->withColumn('User.Email', 'email')
->filterByArray($conditions)
->paginate($page = $page, $maxPerPage = $top);
Однако затем я хочу добавить столбцы вручную, поэтому я подумал, что это просто сработает:
foreach($claims as &$claim){
$claim->actions = array('edit' => array(
'url' => $this->get('router')->generate('hera_claims_edit'),
'text' => 'Edit'
)
);
}
return array('claims' => $claims, 'count' => count($claims));
Однако, когда данные возвращаются, Propel или Symfony2, кажется, удаляют пользовательские данные, когда они преобразуются в JSON вместе со всеми лишними данными модели.
Как правильно добавить данные вручную?
2 ответа
Ответ на это лежит в методе toArray() так:
$claims = ClaimQuery::create('c')
->leftJoinUser()
->withColumn('CONCAT(User.Firstname, " ", User.Lastname)', 'name')
->withColumn('User.Email', 'email')
->filterByArray($conditions)
->paginate($page = $page, $maxPerPage = $top)->getResults()->toArray();
Затем вы можете изменить при необходимости, единственная проблема здесь в том, что текущий метод toArray не возвращает виртуальные столбцы, поэтому вам нужно будет пропатчить метод, чтобы включить их. (Это в классе PropelObjectCollection)
В итоге я решил разделить части:
return array(
'claims' => $claims,
'count' => $claims->count(),
'actions' => $this->actions()
);
Таким образом, вам не нужно беспокоиться о потере виртуальных столбцов, а на другом конце придется просто манипулировать вашими данными.
Чтобы экспортировать виртуальные столбцы в выходной массив, вы можете сделать это следующим образом:
/**
* Propel result set
* @var \PropelObjectCollection
*/
$claims = ClaimQuery::create('c')-> ... ->getResults();
/**
* Array of data with virtual columns
* @var array
*/
$claims_array = array_map(function (Claim $claim) {
return array_merge(
$claim->toArray(), // using "native" export function
array( // adding virtual columns
'Email' => $claim->getVirtualColumn('email'),
'Name' => $claim->getVirtualColumn('name')
)
);
}, $claims->getArrayCopy()); // Getting array of `Claim` objects from `PropelObjectCollection`
unset($claims); // unsetting unnecessary object if we have further operations to complete