首页 > 解决方案 > Symfony 4 / Doctrine:实体上的动态表名 => 函数与 find () OK 但 createQueryBuilder () NOK

问题描述

我有一个数据库(除其他外)由按期间动态命名的统计表组成:
     MY_TABLE_2019_01
     MY_TABLE_2019_02
     ...
     MY_TABLE_2019_10

这个想法是创建一个单一的实体并动态管理它。

我设法通过设置表的名称来动态处理对实体的调用。使用find()方法时,我没有问题,名称更改正确完成,我可以在控制器中进行多次更改而不会遇到错误,但是,由于调用createQueryBuilder(),只有初始配置是考虑到表名的更改之后没有考虑到,但是执行了clear()吗?

问题:为什么使用find()更改是功能性的,但不是使用createQueryBuilder()

我的代码

我的实体,经典但没有表名

    namespace App\Entity;

    use Doctrine\ORM\Mapping as ORM;

    /**
    * @ORM\Table()
    * @ORM\Entity(repositoryClass="App\Repository\MyTableRepository") 
    */
    class MyTable {
        /**
        * @ORM\Id()
        * @ORM\GeneratedValue()
        * @ORM\Column(name="ID", type="integer")
        */
        private $id;

案例N°1,它有效!:)

在我的控制器中:

        $oEntityManager = $this->getDoctrine()->getManager();
        $metadata = $oEntityManager->getClassMetadata(MyTable::class);
        $metadata->setPrimaryTable(array('name' => 'MY_TABLE_2019_02')); //-- Dynamically manage the table
        echo $metadata->getTableName(); //-- 'MY_TABLE_2019_02'
        //--
        $oMyTable = $oEntityManager->getRepository(MyTable::class);
        //--
        $aRetour = $oMyTable->find(1); //-- SELECT ... FROM MY_TABLE_2019_02... OK
        $oMyTable->clear();
        //--
        $metadata->setPrimaryTable(array('name' => 'MY_TABLE_2019_06')); //-- Dynamically manage the table
        echo $metadata->getTableName(); //-- 'MY_TABLE_2019_06' OK
        $aRetour = $oMyTable->find(1); //-- SELECT ... FROM MY_TABLE_2019_06... OK ! IS GOOD :)

案例N°2,它不起作用!:(

在我的存储库中:

        public function myFunction(): array {

            $oRequete = $this->createQueryBuilder('c')->setMaxResults(10);

            return $oRequete->getQuery()
                            ->getResult();
        }

在我的控制器中:

        $oEntityManager = $this->getDoctrine()->getManager();
        $metadata = $oEntityManager->getClassMetadata(MyTable::class);
        $metadata->setPrimaryTable(array('name' => 'MY_TABLE_2019_02')); //-- Dynamically manage the table
        echo $metadata->getTableName(); //-- 'MY_TABLE_2019_02' OK
        //--
        $oMyTable = $oEntityManager->getRepository(MyTable::class);
        //--
        $aRetour = $oMyTable->myFunction(); //-- SELECT ... FROM MY_TABLE_2019_02... OK
        $oMyTable->clear();
        //--
        $metadata->setPrimaryTable(array('name' => 'MY_TABLE_2019_06')); //-- Dynamically manage the table
        echo $metadata->getTableName(); //-- 'MY_TABLE_2019_06' OK !!!!
        $aRetour = $oMyTable->myFunction(); //-- SELECT ... FROM MY_TABLE_2019_02... NOK !!!!!!!!! table name not change here !?

在这种情况下 2,当我创建$metadata->getTableName()我有一个有效的返回,这里是 'MY_TABLE_2019_06',但是当我调用$oMyTable->myFunction()时,通过createQueryBuilder()生成的请求不会改变 ?

你有解决方案或研究方向给我吗?

标签: doctrinesymfony4

解决方案


推荐阅读