私のコードで何が起こっているのか、誰かが光を当ててくれることを願っています。
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;
}
}
問題は、最初に顧客を獲得するときにこれを正しく設定できることですが、2回目はdoctrineによって生成されたSQLが最初に作成したテーブルを使用してしまうことです。
したがって、最初に CustomerX::getCustomerRecords('123') を実行すると、SQL が実行され、CustomerX::getCustomerRecords('987') を実行すると、まだ 'customer_123' が使用されます。
私は何か間違ったことをしているに違いない。テーブル名を正しく削除またはリセットする方法について何か提案があれば、それは素晴らしいことです。
ありがとう。
最初はこれを参考にしました。 Doctrine2でテーブルのスキーマ名をプログラムで変更しますか?