Zend framework 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);

我正在使用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()来实现这一点

非常感谢你的帮助

检查文档()

我认为您应该通过以下代码实现这一点:

$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()的通知。;)