为什么Doctrine对存储库方法名称施加人为限制?

时间:2019-07-03 19:50:42

标签: php doctrine-orm symfony4

有人可以向我解释为什么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开头!

1 个答案:

答案 0 :(得分:0)

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

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