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 模式合并

使用 Doctrine 查询构建器正确转义 LIKE 查询

如何通过 ZF2 FormElementManager 将 Doctrine ObjectManager 传递给表单

Doctrine查询构建器

ZF2 - Doctrine ORM,简单表连接