学说 targetEntity 接口

Posted

技术标签:

【中文标题】学说 targetEntity 接口【英文标题】:doctrine targetEntity interfaces 【发布时间】:2013-01-16 13:39:26 【问题描述】:

我正在尝试将接口用作“targetEntity”。 简单的代码应该解释我打算做什么

界面:

namespace Project\Entity;

interface AnimalInterface



猫:

namespace Project\Entity;
use Doctrine\ORM\Mapping as ORM;
use Project\Entity\AnimalInterface;

/**
 * Represents an Invoice.
 *
 * @ORM\Entity
 * @ORM\Table(name="Cat")
 */
class Cat implements AnimalInterface  

     /**
     * @var int
     * @ORM\Id @ORM\Column(type="integer", name="id")
     * @ORM\GeneratedValue
     */
     protected $id;

狗:

namespace Project\Entity;
use Doctrine\ORM\Mapping as ORM;
use Project\Entity\AnimalInterface;

/**
 * @ORM\Entity
 * @ORM\Table(name="Dog")
 */
class Dog implements AnimalInterface  

     /**
     * @var int
     * @ORM\Id @ORM\Column(type="integer", name="id")
     * @ORM\GeneratedValue
     */
     protected $id;

AnimalFarm(只能包含一只动物;)):

 namespace Project\Entity;
 use Doctrine\ORM\Mapping as ORM;

 /**
 * @ORM\Entity
 * @ORM\Table(name="AnimalFarm")
 */
class AnimalFarm  
    /**
     *
     * @var int
     * @ORM\Id @ORM\Column(type="integer", name="id")
     * @ORM\GeneratedValue
     */
     protected $id;

     /**
     * @ORM\ManyToOne(targetEntity="Project\Entity\AnimalInterface")
     * @var AnimalInterface
     */
     protected $animal;


     public function setAnimal(AnimalInterface $animal)
         $this->animal = $animal;
     

我正在使用此处指定的 TargetEntityResolver -> http://symfony.com/doc/master/cookbook/doctrine/resolve_target_entity.html

bootstrap.php(Zend):

    $em = $doctrine->getEntityManager();
    $evm = $em->getEventManager();

    $listener = new  \Doctrine\ORM\Tools\ResolveTargetEntityListener();
    $listener->addResolveTargetEntity(
            'Project\Entity\AnimalInterface',
            'Project\Entity\Dog',
            array()
    );
    $listener->addResolveTargetEntity(
            'Project\Entity\AnimalInterface',
            'Project\Entity\Cat',
            array()
    );
    $evm->addEventListener(Doctrine\ORM\Events::loadClassMetadata, $listener);

似乎解析器只能将一个实体解析为一个接口,第一个给定的。在这个例子中猫。 Doctrine 建立表 AnimalFarm 与表狗的关系(外键)。 当我尝试通过 EntityManager Doctrine 将狗添加到表中时,会出现以下错误消息: 未捕获的异常“Doctrine\ORM\ORMException”,消息“在关联 Project\Entity\AnimalFarm#animal 上找到类型为 Project\Entity\Dog 的实体,但在 [...] 中期待 Project\Entity\Cat”

好像不能通过一个接口定义多个targetEntities?

我不想使用继承,因为实体可以实现多个接口。 (不能多重继承)

有什么想法吗?

也许我可以找到好的搜索关键字?

非常感谢。

【问题讨论】:

【参考方案1】:

这取自doctrine2 docs。使用此方法只能解析一个对象。

/**
 * An interface that the invoice Subject object should implement.
 * In most circumstances, only a single object should implement
 * this interface as the ResolveTargetEntityListener can only
 * change the target to a single object.
 */
interface InvoiceSubjectInterface

    // List any additional methods that your InvoiceModule
    // will need to access on the subject so that you can
    // be sure that you have access to those methods.

    /**
     * @return string
     */
    public function getName();

【讨论】:

以上是关于学说 targetEntity 接口的主要内容,如果未能解决你的问题,请参考以下文章

为接口的@Embed覆盖@ManyToOne targetEntity

Symfony学说中的许多关系

学说:在自引用中删除实体(多对多)

学说 symfony2 错误:Cocina\ComprasBundle\Entity\Productos 类没有名为proveedores 的关联

Symfony学说OneToAll关系

未定义索引:joinColumns 学说 + symfony2