php - 为什么 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 开头!
解决方案
发生这种情况是因为实体类中的 @ORM\Entity 注释缺少 repositoryClass="App\Repository\FreeClassQueryRepository" 属性。
感谢@ficuscr 提供了类似 StackOverflow 问题的链接(请参阅他的第三条评论)。
推荐阅读
- javascript - Vscode intelisense 在 require/import 语句(JS)中重复
- go - 在“package main”中重复“func main”是否错误,为什么它是错误的?
- java - 无法使用 @value 或使用 Autowired to Enviroment 从属性文件中读取值
- c# - 在每个请求中,新会话都在 web api 中生成
- ios - Xcode 10.2 中 iPad 的此平台不支持 MGIsDeviceOneOfType
- python - 为什么 AWS 在一台服务器上允许 ListObjects 在另一台服务器上被拒绝
- spring - 如何在 Spring 响应式 WebClient 中返回 Kotlin Coroutines Flow
- mysql - 如何在 SQL 中建立账户
- python - L += [a] 和 L.append(a) 的区别
- android - recyclerview 滚动抖动与滑动图像加载,还包含其他 recylerview、webview 和视频帧