我想对模型存储库中的一些代码进行分解。
的一个非常基本的例子
public function getPlayers()
{
$qb = $this->createQueryBuilder('p')
->innerJoin(...) // whatever the request
->where(...)
// I want to factorize this line because a lot of function use it
->andWhere('p.active = true');
return (...);
}
所以我创建了一个私人功能
private function getActivePlayer() {
return $this->andWhere('p.active = true');
}
我想在任何功能中都这样使用它
$qb = $this->createQueryBuilder('p')
->innerJoin(...)
->where(...)
->getActivePlayer()
但我当然有这个错误
Attempted to call method "getActivePlayer" on class "DoctrineORMQueryBuilder"
有可能实现这种因式分解吗?语法是什么?
感谢
您可以尝试以下操作:
public function getPlayers()
{
$qb = $this->createQueryBuilder('p')
->innerJoin(...)
->where(...);
$qb = $this->getPlayerType($qb);
}
private function getActivePlayer(QueryBuilder $qb)
{
return $qb->andWhere('p.active = true');
}
在QueryBuilder
对象的上下文中使用->
运算符将仅调用QueryBuilder
类中的方法。您必须定义自己的类来扩展QueryBuilder
。类似于:
class MyQueryBuilder extends DoctrineORMQueryBuilder {
public function getActivePlayer() {
return $this->andWhere('p.active = true');
}
}
然后实现该生成器,而不是默认的查询生成器:
$qb = new MyQueryBuilder();
$qb->select('p')
->from(...)
->innerJoin(...)
->where(...)
->getActivePlayer()
// ...
请注意,上面的代码只是一个简单的演示,它向您展示了实现您想要做的事情所需的努力长度——在实际实践中,您需要做的不仅仅是这些。
你最好从一个特定的私有方法中的基本QueryBuilder开始,然后在你的公共getter中修改它:
private function getPlayerQueryBuilder()
{
$qb = $this->createQueryBuilder('p')
->innerJoin(...) // whatever the request
->where(...)
return $qb;
}
public function getActivePlayers() {
$result = $this->getPlayerQueryBuilder()
->andWhere('p.active = true')
->getQuery()->getResult();
return $result;
}
public function getAllPlayers() {
$result = $this->getPlayerQueryBuilder()
->getQuery()->getResult();
return $result;
}