我希望有人可以了解我的代码发生了什么.
我需要一个表示通用表的实体作为具有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 \ME\CustomerX(); $custTable->setTableName($CustomerId); $evm = $em->getEventManager(); $evm->addEventListener(\Doctrine\ORM\Events::loadClassMetadata,$custTable); //get the customer info $query = $em->createquery( 'SELECT w FROM \ME\CustomerX w WHERE w.customerId = :CustId'; $query->setParameter('CustId',$CustomerId); $custParams = $query->getResult(); $evm->removeEventListener(\Doctrine\ORM\Events::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(''); } }