Doctrine targetEntity抽象类

时间:2015-12-17 00:15:32

标签: symfony doctrine-orm lazy-loading many-to-one

我得到了不必要的查询,然后实体与抽象类有if [ $i != 0 ] && (cat file.txt | grep -q sometext) then echo allGood exit 0 else echo either i is not 0 or file.txt doesnt contain sometext exit -1 fi 的关系。 我的课程结构:

ManyToOne

我的/** * @ORM\Entity * @ORM\Table(name="tb_payment_info") * @ORM\InheritanceType("JOINED") * @ORM\DiscriminatorColumn(name="type", type="integer") * @ORM\DiscriminatorMap({ * "0" = "PaymentInfoPaypal", * "1" = "PaymentInfoSkrill", * }) */ abstract class AbstractPaymentInfo { /** * @ORM\Column(name="payment_info_id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; } /** * @ORM\Entity * @ORM\Table(name="tb_payment_info_paypal") */ class PaymentInfoPaypal extends AbstractPaymentInfo { } /** * @ORM\Entity * @ORM\Table(name="tb_payment_info_skrill") */ class PaymentInfoSkrill extends AbstractPaymentInfo { } 班级包含Payout表格中的payment_info_id列。

tb_payment_info

当我尝试获取任何/** * @ORM\Entity * @ORM\Table(name="tb_payout") */ class Payout { /** * @var AbstractPaymentInfo * * @ORM\ManyToOne(targetEntity="AbstractPaymentInfo") * @ORM\JoinColumn(name="payment_info_id", referencedColumnName="payment_info_id") */ private $paymentInfo; } 实体时,其Payout会自动初始化。所以:

paymentInfo

有2个查询:第一个用于$this->getEntityManager()->getRepository('TuoPayBundle:Payout')->find(255); ,第二个用于Payout

paymentInfo

有3个查询:第一个用于$this->getEntityManager()->getRepository('TuoPayBundle:Payout')->findBy(['id'=>[255,256]]); ,第二个,第三个单独的查询用于初始化Payout

如何实现延迟加载?

1 个答案:

答案 0 :(得分:0)

您无法使用@ORM\Entity表示法在Doctrine 2中声明抽象类。如果您想在对象模型中使用抽象类,我建议您检查the documentation on Mapped Superclasses如何正确执行此操作。

最重要的是,您应该使用特殊的@ORM\MappedSuperClass注释声明该类。

请记住,Mapped超类有限制。我引用:

  

映射的超类不能是实体,它不是可查询的,并且由映射的超类定义的持久关系必须是单向的(仅具有拥有方)。这意味着根本不可能在映射的超类上进行一对多关联。此外,只有当映射的超类目前仅在一个实体中使用时,才能实现多对多关联。为了进一步支持继承,必须使用单个或连接表继承功能。