【发布时间】:2020-08-24 11:58:12
【问题描述】:
我有一个实体 A,它与实体 B 具有 OneToOne 关系,而实体 B 与实体 C 具有 ManyToOne 关系。
A 1:1 B 1:n C
如果我加载 A,则获取连接的 B,但 C 仍然为空,尽管我在 B 中将 C 定义为 fetch="EAGER"
这是正确的行为吗?我可以通过 findAll 语句获取 A 来获得 C 吗?
这是我的代码: 在 A 类“收费”中:
/**
* One Charge has one ChargeDetail.
*
* @ORM\OneToOne(targetEntity="ChargeDetail", inversedBy="charge", cascade={"persist"})
* @ORM\JoinColumn(name="charge_detail_id", referencedColumnName="id")
*/
private ?ChargeDetail $chargeDetail = null;
在 B 类 ChargeDetail 中:
/**
* @ORM\ManyToOne(targetEntity="Fraud", fetch="EAGER")
* @ORM\JoinColumn(name="fraud_id", referencedColumnName="id")
*/
private ?Fraud $fraud = null;
C 类欺诈
/**
* @ORM\Entity(repositoryClass="App\Repository\FraudRepository")
* @codeCoverageIgnore
*/
class Fraud
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="smallint", options={"unsigned":true})
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private ?int $id = null;
/**
* @ORM\Column(type="string", length=255)
*/
private string $name;
.....
在代码中:
/* @var Charge[] $charges */
$charges = $this->chargeRepo
->findBy([], ['id' => 'DESC'], 1, 0);
$charge = $charges[0];
$charge 将正确填写属性chargeDetail,但chargeDetail 仍将欺诈为null。
【问题讨论】:
-
您能否也包括您的欺诈实体?
-
在问题中添加了欺诈类
-
问题是你真的需要 fetch eager 而不是延迟加载吗?
-
出于大多数目的,我需要一次性访问整个数据。仅对于列表,我只需要部分数据。延迟加载会解决我的问题吗?我猜不是。
-
此问题的第二个答案中的评论说您只能自动获取 1 级深度。如果这是真的,我无法通过单个 find 语句实现我想要的:stackoverflow.com/questions/8420175/…
标签: doctrine