2012-12-12 93 views
3

在我使用下面的查询时刻:向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

这个问题的答案在于指定者()方法,以便:

$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(); 

然后,你可以根据需要修改,这里唯一的问题是,目前的指定者方法不返回虚拟列,所以你将有修补方法以包含它们。 (这是PropelObjectCollection类)

最后,我决定将部分分开:

return array(
     'claims' => $claims, 
     'count' => $claims->count(), 
     'actions' => $this->actions() 
    ); 

这样你就不必担心虚拟列丢失和突出部分有操纵数据在另一端以不同的方式。

1

为虚拟列导出到了数组,你可以做下一个方法:

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