【问题标题】:Using Doctrine2/Zend Framework 1.11 with column containing underscore将 Doctrine2/Zend Framework 1.11 与包含下划线的列一起使用
【发布时间】:2012-03-05 22:00:31
【问题描述】:

我正在将网站重构为 Zend Framework 1.11/Doctrine 2,并且有许多包含带下划线的列名的遗留表(例如,plant_id)。 (一开始很暗示,但我对 Doctrine 印象深刻!)

我已经成功地设置了一个学说实体(遵循 WJ Gilmores 的优秀著作 Easy PHP with the Zend Framework),但是当我们使用 Doctrine 的 findOne 魔术查找器和包含下划线的遗留列名时遇到问题

代码

$plant = $this->em->getRepository('Entities\Plant')
->findOneByPlant_id('3571');

返回错误

Message: Entity 'Entities\Plant' has no field 'plantId'. You can therefore not call 'findOneByPlant_id' on the entities' repository

(顺便说一句,Doctrine 看起来还不错 - 我们已经创建了一个实体,使用 this 作为我们的列名,并且可以检索此列。)

在此期间,我们通过使用查询构建器构建查询解决了这个问题。

除了更改整个表格以删除下划线之外,还有其他不需要太多代码的更简单的解决方案吗(不容易,因为有很多遗留代码需要重新编写)?

【问题讨论】:

    标签: zend-framework frameworks doctrine-orm


    【解决方案1】:

    您不使用魔术查找器中的列名,而是使用实体属性。属性名称根本不需要与实际的列名称匹配。

    试试下面的方法...

    /**
     * @Entity
     */
    class Plant
    {
        /**
         * @Id
         * @Column(name="plant_id", type="integer")
         */
        private $id;
    

    然后,你可以简单地使用

    $plant = $plantRepository->find(3571);
    

    如果您使用非主键列,您只需使用属性名称,例如

    /**
     * @Column(name="some_col_with_underscores")
     */
    private $someProperty;
    

    并通过存储库

    $repo->findOneBySomeProperty($val)
    

    也可以使用数组方法

    $repo->findOneBy(array('someProperty' => $val));
    

    【讨论】:

      【解决方案2】:

      您可以做一件事,但这可能不是最好的方法。因为 Doctrine 试探性地猜测下划线是用于驼峰法的。

      您可以创建您的own repository class。创建此类时,您实现了一个名为 findyByPlant_Id($id) 的方法,并在您的方法中创建了一个 qb:

      <?php
      class PlantRepository extends Doctrine\ORM\Repository {
        function findByPlant_Id($id) {
          $qb = $this->createQueryBuilder('p')->where('p.id = :id')->setParameter('id' ,$id);
      
          return $qb->getQuery()->getOneOrNullResult();
        }
      }
      ?>
      

      我不得不说我没有检查语法,但如果你喜欢这个解决方案,它至少会让你朝着正确的方向前进。可能有更好的解决方案...

      【讨论】:

      • 我想第一个答案在设置方面会更好,但您的轻推将在其他地方有用。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多