Zend framework Doctrine2拆分查询生成器
我正在使用QueryBuilder执行带有Doctrine2的复杂查询 我想拆分此查询以定义或不定义某些条件 然后看起来是这样的:Zend framework Doctrine2拆分查询生成器,zend-framework,doctrine-orm,Zend Framework,Doctrine Orm,我正在使用QueryBuilder执行带有Doctrine2的复杂查询 我想拆分此查询以定义或不定义某些条件 然后看起来是这样的: $logs = $em->getRepository("Shs\Entity\Log") ->createQueryBuilder("log") ->where("log.client = :client") ->setParameter("client", $client);
$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()来实现这一点
非常感谢你的帮助 检查文档()
我认为您应该通过以下代码实现这一点:
$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();
如果我每次重新定义$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()的一些变体进行查询。->from(“Shs\Entity\Log”、“Log”)。谢谢,但这并不能解决问题。。。同样,如果我写$logs=$logs->。。。但它确实有效。是的,这也应该有效(我认为两者都有可能)。老实说,我不明白这个问题。可能尝试重新定义或更具体一些。如果我回显$logs->getQuery()->getSQL():您的代码将显示“SELECT log FROM Shs\Entity\log log WHERE log.client=:client AND log.name LIKE:search ORDER BY log.date DESC”。当我在单个块中编写它时,当您从存储库(而不是直接从实体管理器)创建查询生成器时,它会显示“从日志l0_u0.client_uid=?和l0_0.name LIKE?ORDER BY l0_0.date DESC中选择l0_0.id作为id0,l0_0.name作为name1,l0_0.date作为date 2”,然后不需要使用SELECT或FROM子句。存储库会为您解决这些问题。它可以正常工作,我也能做到,谢谢!:)可以拆分它,这是合乎逻辑的,因为它每次都返回自己,但我想我没有得到结果,因为我混淆了qb和结果。。。所以$logs=$qb->getQuery()->execute()解决了这个问题,显然不需要多次重新定义$logs。我也会得到关于getResult()的通知。;)