我正在将网站重构为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,将其作为我们的列名,并且可以检索此列。)
我们在此期间通过使用查询构建器构建查询来解决这个问题。
除了更改整个表以删除下划线之外,还有其他更简单的解决方案不需要那么多代码(不容易,因为我们需要重做许多遗留代码)?
答案 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();
}
}
?>
我不得不说我没有检查语法,但如果你喜欢这个解决方案,它至少会把你推向正确的方向。可能有更好的解决方案......