将Doctrine2 / Zend Framework 1.11与包含下划线的列一起使用

Using Doctrine2/Zend Framework 1.11 with column containing underscore

我正在将网站重构为Zend Framework 1.11 / Doctrine 2,并且有许多旧表包含带下划线的列名(例如plant_id)。 (起初很亲密,但对教义的印象却一直稳定!)

我已经成功建立了一个学说实体(紧随WJ Gilmores的出色著作Easy PHP与Zend Framework的结合),但是当我们使用Doctrine的findOne魔术查找器以及包含下划线的传统列名称时遇到了问题

代码

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

返回错误

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

(顺便说一句,Doctrine似乎还不错-我们创建了一个以Entity作为列名的实体,并且可以检索此列。)

我们已通过使用查询生成器构建查询来解决此问题。

除了更改整个表以删除下划线之外,是否还有其他不需要太多代码的简单解决方案(不容易,因为有很多旧代码需要我们重新处理)?


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

尝试如下操作...

1
2
3
4
5
6
7
8
9
10
/**
 * @Entity
 */
class Plant
{
    /**
     * @Id
     * @Column(name="plant_id", type="integer")
     */
    private $id;

然后,您可以简单地使用

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

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

1
2
3
4
/**
 * @Column(name="some_col_with_underscores")
 */
private $someProperty;

并通过存储库

1
$repo->findOneBySomeProperty($val)

您也可以使用数组方法

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

您可以做一件事,但这可能不是最好的方法。由于"教义"探究地猜测下划线是用于驼峰package。

您可以创建自己的存储库类。创建此类时,将实现一个名为findyByPlant_Id($ id)的方法,并在该方法中创建一个qb:

1
2
3
4
5
6
7
8
9
10
<?php
class PlantRepository extends Doctrine\\ORM\
epository {
  function findByPlant_Id($id) {
    $qb = $this->createQueryBuilder('p')->where('p.id = :id')->setParameter('id' ,$id);

    return $qb->getQuery()->getOneOrNullResult();
  }
}
?>

我不得不说我没有检查语法,但是如果您喜欢此解决方案,它至少可以将您推向正确的方向。可能会有更好的解决方案...