2012-12-12 142 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