5

我希望有人可以阐明我的代码发生了什么。

我需要一个表示通用表的实体作为具有 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 中以编程方式修改表的模式名称?

4

1 回答 1

6

问题很旧,但它可能对某人有帮助。

如果每次都调用 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('');
  }
}
于 2016-03-16T23:44:02.097 回答