2015-11-25 36 views
1

我需要一种方法来动态创建关系,我选择启动学说的事件时加载类的元数据,loadClassMetadata()主义动态关系不起作用

public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) 
{ 
    $metadata = $eventArgs->getClassMetadata(); 

    $this->em = $eventArgs->getEntityManager(); 
    if ($metadata->getName() != 'AppBundle\Entity\NewsNews') { 
     return; 
    } 
    $attachmentsMetadata = $this->getAttachmentsClassMetadata(); 

    $attachmentsMetadata->mapManyToOne(
     [ 
      "targetEntity" => $metadata->getName(), 
      "fieldName" => "newsNews", 
      'joinColumns' => array(
       array(
        'name' => 'foreign_key', 
        'referencedColumnName' => 'id' 
       ) 
      ), 
      "inversedBy" => "attachments" 
     ] 
    ); 
    $attachmentsMetadata->initializeReflection(); 

    $metadata->mapOneToMany(
     [ 
      "targetEntity" => $attachmentsMetadata->getName(), 
      "fieldName" => "attachments", 
      'joinColumns' => array(
       array(
        'name' => 'id', 
        'referencedColumnName' => 'foreign_key' 
       ) 
      ), 
      "mappedBy" => "newsNews" 
     ] 
    ); 
} 

好,工作,但问题是,当教条将设置数据为这种关系,他抛出这个异常“注意:未定义的指数:newsNews” 我已经检查了类,当学说将附加此数据和newsNews字段丢失反射特性。 如果我忘记了这个过程中的某些部分,我不知道的xD

感谢您的帮助

+0

我不能完全肯定,为什么你会需要这个,此外什么是这种“动态”代码的目的是什么? – tftd

+0

我想自动创建自己的应用程序关系,而无需更改包。谢谢 –

回答

1

映射并不意味着在运行时被改变,你提出的解决方案更多的是劈主义的和,而它可以工作,它可能会导致你一路上更多的黑客。

如果您的限制是您不想修改Attachment映射,您可以使用与已加入的表进行一对多关联。

这样,您只需要映射一对多的反面。但是,您只能以这种方式导航。

文档:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-unidirectional-with-join-table