【问题标题】:doctrine eager load connected entities学说急切加载连接的实体
【发布时间】: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


【解决方案1】:

https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/working-with-objects.html#entity-object-graph-traversal 表示即使延迟加载,您也可以随心所欲地关注关联。

我的问题出在代码的另一个地方,我搞砸了。所以上面显示的情况确实有效,伙计们,如果你不犯愚蠢的其他错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2017-09-28
    • 2012-02-07
    相关资源
    最近更新 更多