1

我有一个带有Doctrine 2 Single Table Inheritance的实体结构,如下所示:

/**    
*
* @ORM\Table(name="animal")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="animaltype", type="integer")
* @ORM\DiscriminatorMap({1 = "Cat", 2 = "Dog"}) 
*/
class Animal
.
.
.

这是继承的实体:

/**    

* @ORM\Entity  
*/
class Dog extends Animal

现在我想用postload 事件对对象做一些事情:

我从 LifecycleEventArgs 对象中获取了 Dog 对象,但仅使用了 Dog 实体的属性,此时侦听器对从 Animal 实体继承的属性一无所知。我究竟做错了什么?有人知道吗?

非常感谢。

4

1 回答 1

1

这些属性在您的 Animal 类中是私有的。我刚刚做了类似的事情,但是您需要使用元数据来获取postLoad方法中的对象属性。

$MetaData = $em->getClassMetadata(get_class($entity));

然后,您可以使用以下命令获取所有字段名称(格式正确,不带“_”)

foreach (array_keys($MetaData->reflFields) as $value) {

}

为了使用这些字段的吸气剂,您可以这样做:

//this will become $entity->getSomeFieldValue()  
//it will eval to false if this doesn't exist
if ($entity->{'get' . ucfirst($value)}()) {}

您的整个代码将类似于:

//Your listener class


private $reg;


public function __construct(Registry $reg) {
    $this->reg = $reg;
}

public function postLoad( LifecycleEventArgs $eventArgs ){

     $entity = $eventArgs->getEntity();

     $em = $this->reg->getManager();

     $MetaData = $em->getClassMetadata(get_class($entity ));
     foreach (array_keys($MetaData->reflFields) as $value) {
         if ($entity->{'get' . ucfirst($value)}()) {
             //here you can get the $entity->someGetter() values
         }
     }
}

在你的 service.yml 你会做:

arguments: ['@doctrine']
tags:
    - { name: doctrine.event_listener, event: postLoad }

请记住,除非您将父类变量切换为,否则protected没有private真正的方法可以直接读取它们。如果您需要任何澄清,请告诉我,但是这种带有元数据的方法对我来说效果很好。它还为您提供关联

于 2013-09-18T16:44:59.090 回答