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(); } } ?> |
我不得不说我没有检查语法,但是如果您喜欢此解决方案,它至少可以将您推向正确的方向。可能会有更好的解决方案...