首页 > 解决方案 > 为什么 Doctrine 对存储库方法名称进行人为限制?

问题描述

有人可以向我解释为什么 Doctrine 要求存储库方法名称以 findBy、findOneBy 或 countBy 开头,为什么即使带有这些前缀的名称也必须以列名结尾?

有一些有用的用例,例如,计算包含多个匹配列的记录数。

// src/Repository/FreeClassQueryRepository.php
class FreeClassQueryRepository extends ServiceEntityRepository
{
  .
  .
  .
  /**
   * Returns true if one or more free class query records match the supplied
   * FreeClassQuery object.
   *
   * @param   FreeClassQuery $query
   * @return  bool
   * @throws  \Doctrine\ORM\NonUniqueResultException
   */
  public function checkForDuplicate( FreeClassQuery $query )
  {
    $q = $this->createQueryBuilder( 'fcq' )
              ->select( 'COUNT(id)' )
              ->andWhere( 'fcq.name = :name' )
              ->setParameter( 'name', $query->getName())
              ->andWhere( 'fcq.email = :email' )
              ->setParameter( 'email', $query->getEmail())
              ->andWhere( 'fcq.street = :street' )
              ->setParameter( 'street', $query->getStreet())
              ->andWhere( 'fcq.city = :city' )
              ->setParameter( 'city', $query->getCity())
              ->andWhere( 'fcq.state = :state' )
              ->setParameter( 'state', $query->getState());
    return $q->getQuery()->getSingleScalarResult();

  }
  .
  .
  .
}

调用此方法会导致此错误:

[错误] 应用程序:调试(原型设计...)失败未定义的方法“checkForDuplicate”。方法名称必须以 findBy、findOneBy 或 countBy 开头!

标签: phpdoctrine-ormsymfony4

解决方案


发生这种情况是因为实体类中的 @ORM\Entity 注释缺少 repositoryClass="App\Repository\FreeClassQueryRepository" 属性。

感谢@ficuscr 提供了类似 StackOverflow 问题的链接(请参阅他的第三条评论)。


推荐阅读