渴望负载的实体

时间:2020-08-24 11:58:12

标签: doctrine

我有一个实体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。

1 个答案:

答案 0 :(得分:0)

https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/working-with-objects.html#entity-object-graph-traversal指出,即使是延迟加载,您也可以按照想要的深度进行关联。

我的问题是代码在另一个地方,我搞砸了。因此,伙计们,如果您没有犯其他愚蠢的错误,那么上面显示的情况是可行的。