Добавление пользовательских столбцов в модель 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
Другие вопросы по тегам