加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php – Doctrine 2中的动态表/实体名称

发布时间:2020-05-25 08:57:21 所属栏目:PHP 来源:互联网
导读:我希望有人可以了解我的代码发生了什么. 我需要一个表示通用表的实体作为具有X id后缀的表的模型.例如,我有一个实体:CustomerX 我需要查询的表是cusotmer_1,customer_2,customer_3 ……等等. 我目前正在使用: class CustomerX {/** * CustomerX * * @Table(

我希望有人可以了解我的代码发生了什么.

我需要一个表示通用表的实体作为具有X id后缀的表的模型.例如,我有一个实体:CustomerX
我需要查询的表是cusotmer_1,customer_2,customer_3 ……等等.

我目前正在使用:

class CustomerX {
/**
 * CustomerX
 *
 * @Table(name="customer_")
 * @Entity
 */


//..... properties and setters/getters....

private $_tableName = null;

public function getTableName() {
    return $this->_tableName;
}

public function setTableName($tableName) {
    $this->_tableName = $tableName;
    return $this;
}

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

    $table = $classMetadata->table;
    $table['name'] = 'customer_'.$this->getTableName();
    $classMetadata->setPrimaryTable($table);
}


public static function getCustomerRecords($CustomerId) {
    $em = Helper_Doctrine::em();

    $custTable = new MECustomerX();
    $custTable->setTableName($CustomerId);
    $evm = $em->getEventManager();
    $evm->addEventListener(DoctrineORMEvents::loadClassMetadata,$custTable);

    //get the customer info
    $query = $em->createQuery(
        'SELECT w
         FROM MECustomerX w
         WHERE w.customerId = :CustId';
    $query->setParameter('CustId',$CustomerId);
    $custParams = $query->getResult();

    $evm->removeEventListener(DoctrineORMEvents::loadClassMetadata,$custTable);
    $em->flush();

    return $custParams;
}

}

所以问题是,我可以在第一次获得客户时正确设置,但第二次,doctrine生成的sql最终使用我创建的第一个表.

因此,如果我首先运行:CustomerX :: getCustomerRecords(‘123’),执行的sql和运行CustomerX :: getCustomerRecords(‘987′)的sql仍在使用’customer_123’.

我一定做错了什么.如果有人有任何关于如何正确删除或重置表名称的建议,那将是很好的.

谢谢.

我最初用这个作为参考.
Programmatically modify table’s schema name in Doctrine2?

问题很老,但对某人有帮助.

如果每次调用loadClassMetada,那么在您的代码中似乎存在问题.
但是,我想,元数据是由学说缓存的.
在这种情况下,您可以直接更改它,请查看以下代码片段,它应该工作:

<?php
class FooController extends Controller {
  function fooAction() {
    $em = $this->getDoctrine()->getEntityManager();
    $cm = $em->getClassMetadata('FooBundle:FooEntity');
    $cm->setTableName('special_table_name');
    $repo = $em->getRepository('FooBundle:FooEntity');
    $entities = $repo->createQueryBuilder('f')
            ->setMaxResults(1)
            ->orderBy('f.id','desc')
            ->getQuery()
            ->getResult();
    return new Response('');
  }
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读