ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法
Posted
技术标签:
【中文标题】ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法【英文标题】:ZF2 Doctrine - using query builder how to point at custom methods in repository 【发布时间】:2015-08-28 15:51:25 【问题描述】:我正在努力解决这个问题,希望有人能够提供帮助。使用 ZF2 和 Doctrine 构建 Web 应用程序我正在尝试使用 Doctrine 的查询构建器在我的实体文件中使用自定义方法来构建查询。对于简单的示例实体文件如下(为清楚起见而缩短):
/**
* Get firstName
*
* @return string
*/
public function getFirstName()
return $this->firstName;
/**
* Get lastName
*
* @return string
*/
public function getLastName()
return $this->lastName;
public function getFullName()
return $this->getFirstName() . ' ' . $this->getLastName();
所以名字和姓氏直接映射到dB列,getFullName是实体文件中的自定义方法。然后使用自定义存储库扩展实体以进行查询,我想使用 getFullName 方法。我在存储库中有以下内容(扩展实体文件):
$qb = $this->_em->createQueryBuilder();
$qb->select('employee')
->from('Application\Entity\Employee', 'employee')
->andWhere('employee.fullName = :foo')
->setParameter('foo', 'Joe Bloggs');
$query = $qb->getQuery();
我希望在 andWhere 语句中它会翻译 employee.fullName 以找到 getFullName 方法,但它似乎没有。请问有人有什么想法吗?
谢谢 詹姆斯
【问题讨论】:
【参考方案1】:简单的答案是:“你不能!”。 getFullName
方法与教义无关,因为它只存在于模型中。
模拟你想要的最简单的方法是将名称拆分为部分并使用它:
$fullName = 'Joe Bloggs';
list($firstName, $lastName) = explode(' ', $fullName);
$qb = $this->_em->createQueryBuilder();
$qb->select('employee')
->from('Application\Entity\Employee', 'employee')
->andWhere('employee.firstName = :first')
->andWhere('employee.lastName = :last')
->setParameter('first', $firstName)
->setParameter('last', $lastName);
$query = $qb->getQuery();
【讨论】:
+1 该方法可以接受名字和姓氏作为参数,而不需要分解字符串,即findByFirstAndLastName($firstName, $lastName)
。正如你所说,fullName
不是由 Doctrine 建模的,getFullName()
的返回值可能会改变(例如Mr Joe Bloggs
)。
@AlexP 你是完全正确的,最好使用$firstName
和$lastName
作为方法参数而不是爆炸它。但在我的回答中,我希望尽可能接近给定的示例代码。以上是关于ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法的主要内容,如果未能解决你的问题,请参考以下文章
zf2 doctrine2如何在实体列中使用tinyint数据类型
ZF2 Skeleton 和 Doctrine ORM xml 模式合并