我希望有人能够阐明我的代码发生了什么。
我需要一个实体来表示通用表,作为具有 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;
}
}
所以问题是,我第一次运行获取客户时可以正确设置此设置,但第二次时,由原则生成的 sql 最终使用我创建的第一个表。
因此,如果我首先运行:CustomerX::getCustomerRecords('123'),则执行的sql以及当我运行CustomerX::getCustomerRecords('987')时仍然使用'customer_123'。
我一定做错了什么。如果有人对如何正确删除表名或将表名重置为新名称有任何建议,那就太好了。
Thanks.
我最初以此作为参考。以编程方式修改 Doctrine2 中表的模式名称? https://stackoverflow.com/questions/17134855/programmatically-modify-tables-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('');
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)