[英]Doctrine2 dynamic table name for entity
I'm trying to add a dynamic table name for some of my entities. 我正在尝试为我的一些实体添加动态表名。
I read this post [Dynamic Table/Entity names in Doctrine 2][1] [1]: Dynamic Table/Entity names in Doctrine 2 and this one about doctrine listener [doctrine listener][2] [2] : http://doctrine-orm.readthedocs.org/en/latest/reference/events.html 我读过这篇文章[Doctrine 2中的动态表/实体名称] [1] [1]: Doctrine 2中的动态表/实体名称,以及关于doctrine listener [doctrine listener] [2] [2]的这一个: http:// doctrine-orm.readthedocs.org/en/latest/reference/events.html
So here is the way I try to do it : 所以这是我尝试这样做的方式:
I've create an entity with a wildcard in it's table name : 我在其表名中创建了一个带通配符的实体:
<?php
namespace DD\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* SiteElec
*
* @ORM\Table(name="site_x_elec")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
* @ORM\EntityListeners({"DD\MyBundle\Entity\Listener\SiteElecListener"})
*/
class SiteElec
{
I skip properties with getters and setters
}
Next I've done a listener for this entity : 接下来我为这个实体做了一个监听器:
<?php
namespace DD\MyBundle\Entity\Listener;
use DD\UserBundle\Entit\User;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
/**
* Listener pour l'entité siteElec.
*/
class SiteElecListener {
private $_tableName = null;
protected $token_storage;
protected $user;
public function getTableName() {
return $this->_tableName;
}
public function setTableName($tableName) {
$this->_tableName = $tableName;
return $this;
}
public function __construct(TokenStorageInterface $token_storage) {
$this->token_storage = $token_storage;
if($token_storage->getToken() != null){
}
}
/*
* @ORM\LoadClassMetadata
* @param LoadClassMetadataEventArgs $eventArgs
*/
public function loadClassMetadata(LoadClassMetadataEventArgs $args) {
//$this->user = $this->token_storage->getToken();
//var_dump($this->token_storage);
$classMetadata = $args->getClassMetadata();
$table = $classMetadata->table;
var_dump($classMetadata);
// $table['name'] = 'site_'.$this->user->getSite()->getId().'_elec';
// $classMetadata->setPrimaryTable($table);
}
}
Next I declare my listener in config file : 接下来,我在配置文件中声明我的监听器:
dd.entity_listener.site_elec:
class: DD\MyBundle\Entity\Listener\SiteElecListener
arguments:
- "@security.token_storage"
tags:
- { name: doctrine.event_listener, event: loadClassMetadata }
If I look at $classMetadata var I only have my user entity and the associated entity but not my SiteElec entity 如果我查看$ classMetadata var,我只有我的用户实体和关联实体,但不是我的SiteElec实体
I must have done a mistake somewhere but I don't know where. 我一定是在某处犯了错误,但我不知道在哪里。
Any idea ? 任何的想法 ? Thanks
谢谢
You can use a dynamic table name for some of entities in Doctrine 2 in this way 您可以通过这种方式为Doctrine 2中的某些实体使用动态表名
1) Set Table(name="NULL") in entity 1)在实体中设置表(名称=“NULL”)
<?php
namespace DD\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* SiteElec
*
* @Table(name="NULL")
* @ORM\Entity
*/
class SiteElec { ... }
2) Then set table name before using entity 2)然后在使用实体之前设置表名
$EM
->getClassMetadata('DD\MyBundle\Entity\SiteElec')
->setTableName($DYNAMIC_TABLE_NAME);
3) Use entity with dynamic table name as usual 3)像往常一样使用具有动态表名的实体
$result = $EM
->getRepository('DD\MyBundle\Entity\SiteElec')
->findBy(['id' => $SOME_ID]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.