我正在使用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()吗?
非常感谢你的帮助!
答案 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();