Symfony教义水合器-与习惯水合器我失去了我的多人关系

Symfony教义水合器-与习惯水合器我失去了我的多人关系,symfony,doctrine-orm,doctrine,many-to-one,hydration,Symfony,Doctrine Orm,Doctrine,Many To One,Hydration,我想扩展ObjectHyderator以受益于我的多人关系的水合作用,并为实体添加额外的字段 这是我的水合器:StatisticsDataHydrator.php namespace AppBundle\Hydrator\ProjectAssignment; use AppBundle\Entity\ProjectAssignment; use Doctrine\ORM\Internal\Hydration\ObjectHydrator; class StatisticsDataHy

我想扩展ObjectHyderator以受益于我的多人关系的水合作用,并为实体添加额外的字段

这是我的水合器: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
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('44')
        ->where($qb->expr()->eq('pa.project_stage', ':stage'))
        ->setParameter('stage', $stage);

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

但当我使用水合器时:

/**
 * @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');
}

最奇怪的行为是,这个config:config.yml也会发生同样的情况

doctrine:
    orm:
        hydrators:
            project_assignment_statisticsdata_hydrator: AppBundle\Hydrator\ProjectAssignment\StatisticsDataHydrator
doctrine:
    orm:
        hydrators:
            project_assignment_statisticsdata_hydrator: Doctrine\ORM\Internal\Hydration\ObjectHydrator
我尝试过各种关系,但都没有成功:

@ORM\ManyToOne(... , fetch="EAGER")
@ORM\ManyToOne(... , fetch="LAZY")
...
也许我必须在我的实体上使用代理,我真的不知道:(


感谢您的帮助!

太好了!我发现问题出在我的查询生成器上。我必须手动添加连接并选择相关对象

/**
 * @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');
}
奖金,这是我的水合器(它可以帮助别人):

在我的实体中,我有以下属性/getter/setter

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

/***************************************/
问题是,如果查询模式不是
HYDRATE\u OBJECT
,或者如果查询提示
hint\u include\u meta\u columns
未设置为true,则不会加载包含子类和关联的元列:

$addMetaColumns=!$this->query->getHint(query::HINT\u FORCE\u PARTIAL\u LOAD)&&
$this->query->getHydrationMode()==query::hydration\u对象
||
$this->query->getHydrationMode()!=query::hydration\u对象&&
$this->query->getHint(query::HINT\u包含\u META\u列);
该问题已在中报告

正如本期文章作者所提到的,您可以实现建议的修复,或者将查询提示
hint\u INCLUDE\u META\u COLUMNS
设置为true:

$query=$queryBuilder->getQuery();
$query->setHint(query::HINT\u INCLUDE\u META\u列,true);
$result=$query->getResult('customer');

我也有同样的问题,但我不明白为什么在使用自定义水合器时,我们应该显式地声明所有连接。我复制了Doctrine的Object水合器,但由于某些原因,代理类没有加载。一定有更好的方法来解决这个问题。