Doctrine2拆分查询生成器

时间:2014-07-31 08:18:12

标签: zend-framework doctrine-orm

我正在使用QueryBuilder来使用Doctrine2执行复杂查询。

我想拆分此查询以定义或不定义某些条件。

它看起来像那样:

$logs = $em->getRepository("Shs\Entity\Log")
           ->createQueryBuilder("log")
           ->where("log.client = :client")
           ->setParameter("client", $client);

if($search != ""){
    $logs->andWhere("log.name LIKE :search")
         ->setParameter("search", "%" . $search . "%");
}

$logs->addOrderBy("log.date", "DESC")
     ->getQuery()->execute();

然而,这似乎不起作用。

如果我在一个块中写它,它可以工作:

$logs = $em->getRepository("Shs\Entity\Log")
           ->createQueryBuilder("log")
           ->where("log.client = :client")
           ->andWhere("log.name LIKE :search")
           ->setParameter("search", "%" . $search . "%")
           ->setParameter("client", $client)
           ->addOrderBy("log.date", "DESC")
           ->getQuery()->execute();;

如果我每次重新定义$ logs,但我不明白为什么:

$logs = $em->getRepository("Shs\Entity\Log")
           [...]
           ->setParameter("client", $client);

if($search != ""){
    $logs = $logs->andWhere("log.name LIKE :search")
         ->setParameter("search", "%" . $search . "%");
}

$logs = $logs->addOrderBy("log.date", "DESC")
     ->getQuery()->execute();

在QueryBuilder类中,我看到add函数有一个参数$ append = false。 addOrderBy函数(例如)调用add函数,但将$ append设置为true:

public function addOrderBy($sort, $order = null)
{
    return $this->add('orderBy', $sort . ' ' . (! $order ? 'ASC' : $order), true);
}

如果我强制$ append为false它也可以,但我不会触及这个类。

实现我想做的最好的方法是什么?我应该使用$ qb-> add()而不是$ qb-> where()等,还是有办法用$ qb-> where()吗?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

如果我每次重新定义$ logs,但我不明白为什么:

我猜你在复制/粘贴查询时丢失的其他地方可能有错误。请考虑区分日志集合和查询构建器。类似的东西:

$qb = $em->getRepository("Shs\Entity\Log")
       ->createQueryBuilder("log")
       ->where("log.client = :client")
       ->setParameter("client", $client);

if($search != ""){
    $qb->andWhere("log.name LIKE :search")->setParameter("search", "%" . $search . "%");
}

$qb->addOrderBy("log.date", "DESC");

$logs = $qb->getQuery()->getResults();

使用execute()方法也有点奇怪。通常,您会使用getResults()的一些变体进行查询。

答案 1 :(得分:0)

检查文档(http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html)。

我认为您应该通过此代码实现这一目标:

$logs = $em->createQueryBuilder()
           ->select("log")
            ->from("Shs\Entity\Log log")
           ->where("log.client = :client")
           ->setParameter("client", $client);

if($search != ""){
    $logs->andWhere("log.name LIKE :search")
         ->setParameter("search", "%" . $search . "%");
}

$logs->addOrderBy("log.date", "DESC")
     ->getQuery()->execute();