我希望有人可以了解我的代码发生了什么.
我需要一个表示通用表的实体作为具有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(''); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。