2017-09-12 3 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

하지만 내 하이드 레이터를 사용할 때 :

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

이상한 행동이이 설정과 같은 발생 시킬수 있음 : config.yml 나는 모든 시도

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

의 종류 가져 오기 성공과 관련하여 :

@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; 
    } 
} 

i를 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; 
} 

/***************************************/ 
관련 문제