Doctrine2动态表名实体

8

我想为我的一些实体添加动态表名。

我阅读了这篇文章[Doctrine 2中的动态表/实体名称][1] [1]:Dynamic Table/Entity names in Doctrine 2和这篇关于doctrine监听器的文章[doctrine监听器][2][2]:http://doctrine-orm.readthedocs.org/en/latest/reference/events.html

所以我尝试这样做:

我创建了一个带有通配符的实体表名:

<?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

}

接下来我已经为这个实体编写了一个监听器:

<?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);
}

}

下一步,我在配置文件中声明我的监听器:
    dd.entity_listener.site_elec:
    class:      DD\MyBundle\Entity\Listener\SiteElecListener
    arguments:  
        - "@security.token_storage"
    tags:
        - { name: doctrine.event_listener, event: loadClassMetadata }

如果我查看 $classMetadata变量,我只能看到我的用户实体和关联的实体,但没有我的SiteElec实体。

我肯定是哪里搞错了,但我不知道在哪里。

有任何想法吗? 谢谢。

1个回答

11
您可以使用动态表名来定义Doctrine 2中的某些实体,方法如下:
1)在实体中设置Table(name =“ NULL”)
<?php

namespace DD\MyBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * SiteElec
 *
 * @Table(name="NULL")
 * @ORM\Entity
 */
class SiteElec { ... }

2) 然后在使用实体之前设置表名

$EM
  ->getClassMetadata('DD\MyBundle\Entity\SiteElec')
  ->setTableName($DYNAMIC_TABLE_NAME);

3) 像往常一样使用带有动态表名的实体

$result = $EM
  ->getRepository('DD\MyBundle\Entity\SiteElec')
  ->findBy(['id' => $SOME_ID]);

1
这将在“开发”环境上运行,但不会在“生产”环境中工作。查询缓存也必须在“生产”环境下禁用。我通过以下方式完成了此操作:$queryBuilderQuery = $queryBuilder->getQuery(); $queryBuilderQuery->expireQueryCache(); - Nemke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接