2017-09-12 6 views
1

私はManyToOne関係の水和の恩恵を受けるためにObjectHydratorを拡張し、Entityに余分なフィールドを追加したいと思います。ここでSymfony Doctrine Hydrator - カスタムハイドレーターを使用してManyToOne関係を失う

私のハイドレーターである:StatisticsDataHydrator.php

namespace AppBundle\Hydrator\ProjectAssignment; 

use AppBundle\Entity\ProjectAssignment; 
use Doctrine\ORM\Internal\Hydration\ObjectHydrator; 

    class StatisticsDataHydrator extends ObjectHydrator 
    { 
     /** 
     * {@inheritdoc} 
     */ 
     protected function hydrateRowData(array $data, array &$result) 
     { 
      $hydrated_result = array(); 
      parent::hydrateRowData($data, $hydrated_result); 

      /** @var ProjectAssignment $project_assignment */ 
      $project_assignment = $hydrated_result[0][0]; 

      $result[] = $project_assignment; 
     } 
    } 

ここでは私の設定です:config.yml私は何の問題もないハイドレーターを使用しないでください

doctrine: 
    orm: 
     hydrators: 
      project_assignment_statisticsdata_hydrator: AppBundle\Hydrator\ProjectAssignment\StatisticsDataHydrator 

/** 
* @param ProjectStage $stage 
* @return array 
*/ 
public function findByStageWithStatisticsData(ProjectStage $stage){ 
    $qb = $this->createQueryBuilder('pa'); 

    $qb 
     //->addSelect('44') 
     ->where($qb->expr()->eq('pa.project_stage', ':stage')) 
     ->setParameter('stage', $stage); 

    return $qb->getQuery()->getResult(); 
} 

enter image description here

しかし、私は私のハイドレーターを使用する場合:私は、フェッチのすべての種類を試してみましたconfig.yml

doctrine: 
    orm: 
     hydrators: 
      project_assignment_statisticsdata_hydrator: Doctrine\ORM\Internal\Hydration\ObjectHydrator 

/** 
* @param ProjectStage $stage 
* @return array 
*/ 
public function findByStageWithStatisticsData(ProjectStage $stage){ 
    $qb = $this->createQueryBuilder('pa'); 

    $qb 
     ->addSelect('1234') // referencial value 
     ->where($qb->expr()->eq('pa.project_stage', ':stage')) 
     ->setParameter('stage', $stage); 

    return $qb->getQuery()->getResult('project_assignment_statisticsdata_hydrator'); 
} 

enter image description here

を奇妙な振る舞いは、この設定と同じoccureということです成功との関係で:

@ORM\ManyToOne(... , fetch="EAGER") 
@ORM\ManyToOne(... , fetch="LAZY") 
... 

私のエンティティでプロキシを使用する必要があるかもしれませんが、本当にわかりません:(

ありがとうございました!

答えて

2

素晴らしい!私は問題を発見した、それは私のクエリビルダーとだった。ジョインと関連オブジェクトの選択を手動で追加する必要がありました。

/** 
* @param ProjectStage $stage 
* @return array 
*/ 
public function findByStageWithStatisticsData(ProjectStage $stage){ 
    $qb = $this->createQueryBuilder('pa'); 

    $qb 
     ->addSelect('e') // added 
     ->addSelect('r') // added 
     ->addSelect('1234') 
     ->leftJoin('pa.employee', 'e') // added 
     ->leftJoin('pa.role', 'r') // added 
     ->where($qb->expr()->eq('pa.project_stage', ':stage')) 
     ->setParameter('stage', $stage); 

    return $qb->getQuery()->getResult('project_assignment_statisticsdata_hydrator'); 
} 

ボーナス、ここに私のハイドレーターは、(それが誰かを助けることができる)である。

namespace AppBundle\Hydrator\ProjectAssignment; 

use AppBundle\Entity\Hydrator\ProjectAssignment\StatisticsData; 
use AppBundle\Entity\ProjectAssignment; 
use Doctrine\ORM\Internal\Hydration\ObjectHydrator; 

class StatisticsDataHydrator extends ObjectHydrator 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    protected function hydrateRowData(array $data, array &$result) 
    { 
     $hydrated_result = array(); 
     parent::hydrateRowData($data, $hydrated_result); 

     /** @var ProjectAssignment $project_assignment */ 
     $project_assignment = $hydrated_result[0][0]; 

     $keys = array_keys($hydrated_result); $key = end($keys); 

     $statistics_data = new StatisticsData($project_assignment); 
     $statistics_data->setTotalWorkedTime((int)$hydrated_result[$key][1]); 

     $project_assignment->setStatisticsData($statistics_data); 

     $result[] = $project_assignment; 
    } 
} 

私のエンティティでは、私はfolowing属性/ゲッター/セッターを持って

/********** NON SYNCED FIELDS **********/ 

/** @var StatisticsData $statistics_data */ 
private $statistics_data; 

/** 
* @return StatisticsData 
*/ 
public function getStatisticsData() 
{ 
    return $this->statistics_data; 
} 

/** 
* @param StatisticsData $statistics_data 
*/ 
public function setStatisticsData($statistics_data) 
{ 
    $this->statistics_data = $statistics_data; 
} 

/***************************************/ 
は、
関連する問題