链接自己的查询symfony2存储库



我想对模型存储库中的一些代码进行分解。

的一个非常基本的例子

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;
}

相关内容

  • 没有找到相关文章

最新更新