gpt4 book ai didi

php - Doctrine -OneToMany关系,所有结果行均未在对象中提取

转载 作者:行者123 更新时间:2023-12-03 11:20:38 25 4
gpt4 key购买 nike

我尝试将我的所有对象DemandCab与其子对象(DecisionCab)一起获得。

我的2个实体

/**
* DemandCab.
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="DemandCabRepository")
*/
class DemandCab
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var DecisionCab
*
* @ORM\OneToMany(targetEntity="\My\CabBundle\Entity\DecisionCab", mappedBy="demandCab")
*/
private $decisionsCab;

/**
* @var \DateTime
*
* @ORM\Column(name="startDate", type="datetime")
*/
private $startDate;

/**
* @var \DateTime
*
* @ORM\Column(name="endDate", type="datetime", nullable=true)
*/
private $endDate;

/**
* @var int
*
* @ORM\Column(name="followup", type="integer", nullable=true)
*/
private $followup;

/**
* @var InfoCab
*
* @ORM\ManyToOne(targetEntity="\My\CabBundle\Entity\InfoCab", inversedBy="demandsCab")
*/
private $infoCab;

}

/**
* DecisionCab.
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="DecisionCabRepository")
*/
class DecisionCab
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var DemandCab
*
* @ORM\ManyToOne(targetEntity="\My\CabBundle\Entity\DemandCab", inversedBy="decisionsCab")
*/
private $demandCab;

/**
* @var bool
*
* @ORM\Column(name="decision", type="boolean", nullable=true)
*/
private $decision;

/**
* @var string
*
* @ORM\Column(name="motif", type="string", length=500, nullable=true)
*/
private $motif;

/**
* @var string
*
* @ORM\Column(name="role", type="string", length=255)
*/
private $role;

/**
* @var \DateTime
*
* @ORM\Column(name="date", type="datetime", nullable=true)
*/
private $date;

/**
* @var DemandCab
*
* @ORM\ManyToOne(targetEntity="\My\CabBundle\Entity\DemandCab", inversedBy="decisionsCab")
*/
private $demandCab;

/**
* @var User
*
* @ORM\ManyToOne(targetEntity="\My\CabBundle\Entity\User", inversedBy="decisionsCab")
*/
private $user;
}

在我的DemandCab存储库中
public function findAllCompleted(){
$qb = $this->createQueryBuilder("dem");
$qb->select('dem, dec');
$qb->leftJoin("dem.decisionsCab", "dec");
$qb->andWhere("dem.completed = 1");
$qb->orderBy("dem.startDate", "DESC");

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

我的DemandCab数据

My DemandCab data

我的DecisionCab数据

enter image description here

当我转储结果时,仅出现2条决定...
enter image description here

...而当我使用 getArrayResult时,我有4个决定...
enter image description here

该查询很好,但是我不明白为什么 hydration 会删除属性 decision为0或1(仅显示null)的DecisionCab对象。

我想了解为什么以及是否有一种解决方案,可以将DemandCab对象与所有DecisionCab子对象一起使用。

谢谢

最佳答案

我可以重现您的问题,但不确定是否属于您的情况。

无论如何,我的假设是,在查询生成器的帮助下,至少查询一次与关系相关联的需求实体。也许这是在您的操作,事件监听器或代码中的其他地方完成的。

因此,您可能会遇到以下情况:

$qb = $this->getDoctrine()
->getRepository(DemandCab::class)->createQueryBuilder("dem");
$qb->select('dem, dec');
$qb->leftJoin("dem.decisionsCab", "dec");

$qb->andWhere("dec.decision IS NULL");
$qb->orderBy("dem.startDate", "DESC");

$results = $qb->getQuery()->getResult(); // <-- the decisionsCab collection is hydrated but filtered

$qb2 = $this->getDoctrine()
->getRepository(DemandCab::class)->createQueryBuilder("dem");
$qb2->select('dem, dec');
$qb2->leftJoin("dem.decisionsCab", "dec");

$qb2->andWhere("dem.completed = 1");
$qb2->orderBy("dem.startDate", "DESC");

$q = $qb2->getQuery();
//$q->setHint(Query::HINT_REFRESH, true);

$results = $q->getResult();

问题出在 Doctrine\ORM\Internal\Hydration\ObjectHydrator 中,它具有属性“ initializedCollections ”,其中已初始化的集合将保留,并且集合由父实体类型和实体本身进行哈希处理。不幸的是,在上述情况下,混合器无法理解在第一个查询中对集合进行了过滤,并在第二个查询中使用了该集合,以避免补液。

解决方案是使查询构建器 刷新。尝试代码:
$qb->orderBy("dem.startDate", "DESC");
$q = $qb->getQuery();
$q->setHint(Query::HINT_REFRESH, true); // <-- Tell the hydrator to refresh
return $q->getResult();

关于php - Doctrine -OneToMany关系,所有结果行均未在对象中提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48152609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com