繁体   English   中英

教义映射到未知实体

[英]Doctrine mapping to unknow entity

是否可以创建与通用表/类相关的准则?

这是一些使它易于理解的代码:

// class Log...

// TODO:
// It could be useful to have a reference to
// the element mentioned by the log, the issue is
// we don't know what kind of entity it is.

/**
 * @ORM\ManyToOne(targetEntity="???")
 */
private $elementId

也许不使用targetEntity而是使用int,它是位于unknow表中的元素的id。

您正在尝试管理数据库级别中一个或多个实体的某种抽象,这令人头疼,

主义已经提出了Somme解决方案,以通过使用继承映射来管理这种抽象。

映射的超类是抽象类或具体类,它为其子类提供持久的实体状态和映射信息,但它本身并不是实体。 通常,此类映射超类的目的是定义多个实体类共有的状态和映射信息。

有关更多信息,请检查

现在没有内置的可能性。

让我提出有关使用“ Doctrine生命周期事件”的工作的建议:

  • 创建3个属性:

     /* * @ORM\\Column(name="element_class", type="string") */ private $elementClass /* * @ORM\\Column(name="element_id", type="integer") */ private $elementId // Not mapped private $element public function setElement($element) { $this->element = $element; $this->elementClass = get_class($element); $this->elementId = $element->getId(); } public function getElement() { return $this->element; } // You need these for the PostLoad event listener : public function hydrateElementPostLoad($element) { $this->element = $element; } public function getElementClass() { return $this->elementClass; } public function getElementId() { return $this->elementId; } 
  • 然后创建一个PostLoadListener,它可以使element属性水合:

     namespace AppBundle\\EventListener; use Doctrine\\ORM\\Event\\LifecycleEventArgs; use AppBundle\\Entity\\Log; class PostLoadListener { public function postLoad(LifecycleEventArgs $args) { $entity = $args->getEntity(); if($entity instanceOf Log){ $em = $args->getEntityManager(); $entity->hydrateElementPostLoad( $this->em->getRepository($entity->getElementClass())->findOneById($entity->getElementId()) ); } } } 
  • 并在您的services.yml中注册此事件:

     services: places.listener: class: AppBundle\\EventListener\\PostLoadListener tags: - { name: doctrine.event_listener, event: postLoad } 

这也是最著名的日志记录捆绑软件的工作方式( The Gedmo DoctrineExtensions Logger

  • 要检索一个实体的所有日志,请为您的Log实体创建一个存储库方法:

     getLogs($entity) { return $this->_em->findBy(array( 'element_id'=>$entity->getId(), 'element_class'=>get_class($entity) )); } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM