3

現時点では、以下のクエリを使用しています。

$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 に変換されるときに、カスタム データを削除しているようです。

この方法で手動でデータを追加する正しい方法は何ですか?

4

2 に答える 2

3

仮想列を配列にエクスポートするには、次の方法で実行できます。

/**
 * 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
于 2015-01-28T08:58:51.707 に答える
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()
    );

このようにして、仮想列が失われることを心配する必要がなく、反対側でさまざまな方法でデータを操作する必要がなくなります。

于 2012-12-12T17:02:48.050 に答える