Doctrine 2中的动态表/实体名称
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Doctrine 2中的动态表/实体名称相关的知识,希望对你有一定的参考价值。
我希望有人可以了解我的代码发生了什么。
我需要一个表示通用表的实体作为具有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('');
}
}
以上是关于Doctrine 2中的动态表/实体名称的主要内容,如果未能解决你的问题,请参考以下文章
Zend 2 Framework - Doctrine从给定的2个实体生成表
Propper实体关联与一个实体映射为连接表(Doctrine 2)