Symfony教义水合器-与习惯水合器我失去了我的多人关系
我想扩展ObjectHyderator以受益于我的多人关系的水合作用,并为实体添加额外的字段 这是我的水合器:StatisticsDataHydrator.phpSymfony教义水合器-与习惯水合器我失去了我的多人关系,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
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水合器,但由于某些原因,代理类没有加载。一定有更好的方法来解决这个问题。