我希望有人可以阐明我的代码发生了什么。
我需要一个表示通用表的实体作为具有 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'。
我一定做错了什么。如果有人对如何正确删除表名或将表名重置为新名称有任何建议,那就太好了。
谢谢。
我最初用这个作为参考。 在 Doctrine2 中以编程方式修改表的模式名称?