На данный момент я использую следующий запрос:
$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 вместе со всеми данными зафронтовой модели.
Каков правильный способ ручного добавления данных таким образом?
Ответ на это заключается в методе 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