使用包含下划线的列的Doctrine2 / Zend Framework 1.11

时间:2012-03-05 22:00:32

标签: zend-framework frameworks doctrine-orm

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

我已经成功建立了一个学说实体(遵循WJ Gilmores的优秀书籍Zend Framework的Easy PHP),但是当我们使用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看起来很好 - 我们创建了一个Entity,将其作为我们的列名,并且可以检索此列。)

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

除了更改整个表以删除下划线之外,还有其他更简单的解决方案不需要那么多代码(不容易,因为我们需要重做许多遗留代码)?

2 个答案:

答案 0 :(得分:3)

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

尝试以下内容......

/**
 * @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));

答案 1 :(得分: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();
  }
}
?>

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