是否可以添加到现有的 Doctrine 查询中?

Is it possible to add on to an existing Doctrine Query?

我在 Symfony 中构建了一个页面,它利用 Doctrine 查询生成器来 return 结果。该页面还集成了搜索功能。该页面目前运行良好,但我想知道我的代码的 Doctrine Query Builder 部分是否可以重构?

所以我的问题是,而不是复制和粘贴相同的查询(正如我在下面的代码($results)中所做的那样)并向查询构建器,是否可以将附加选项附加到第一个查询,这样我就不必重新使用代码?

$em = $this->getDoctrine()->getManager('managerName');
$results = $em->createQueryBuilder()
       ->select('d.name','d.createdAt')
       ->from('ManagerName:Demo', 'd')
       ->orderBy('d.name')
       ->getQuery()
       ->getResult();

if ($form->isSubmitted() && $form->isValid()) {
    if (isset($_POST['submit'])) {
        $em = $this->getDoctrine()->getManager('managerName');
        $results = $em->createQueryBuilder()
              ->select('d.name', 'd.createdAt')
              ->from('ManagerName:Demo', 'd')
              ->where('d.name LIKE :searchTerm')
              ->orderBy('d.name')
              ->setParameter('searchTerm', '%' . $search->getSearch() . '%')
              ->getQuery()
              ->getResult();
            return $this->render('AcmeBundleName:Demo:index.html.twig', [
                "form" => $form->createView(),
                "results" => $results,
                "search" => $search->getSearch(),
            ]);
        }
    return $this->redirect($request->getUri());
}

因此,我正在寻找 for/trying 的示例如下所示:

$em = $this->getDoctrine()->getManager('managerName');

$query = $em->createQueryBuilder()
       ->select('d.name','d.createdAt')
       ->from('ManagerName:Demo', 'd')
       ->orderBy('d.name')
       ->getQuery();

$results = $query->getResult();

if ($form->isSubmitted() && $form->isValid()) {
    if (isset($_POST['submit'])) {                
        $em = $this->getDoctrine()->getManager('managerName');

        $results = $query->where('d.name LIKE :searchTerm')
               ->setParameter('searchTerm', '%' . $search->getSearch() . '%');

        return $this->render('AcmeBundleName:Demo:index.html.twig', [
                "form" => $form->createView(),
                "results" => $results,
                "search" => $search->getSearch(),
            ]);
    }
    return $this->redirect($request->getUri());
}

我不知道是否可以扩展我之前构建的查询,而且连续数小时谷歌搜索似乎return 没有任何有用的资源可供我参考。

我还查看了大量 Doctrine 文档,包括以下内容但没有成功:http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html

提前致谢

在这种情况下,您只需要在执行请求时调用getQuery()

$em = $this->getDoctrine()->getManager('managerName');

$query = $em->createQueryBuilder()
        ->select('d.name','d.createdAt')
        ->from('ManagerName:Demo', 'd')
        ->orderBy('d.name');

$results = $query
    ->getQuery()
    ->getResult();

if ($form->isSubmitted() && $form->isValid()) {
    if (isset($_POST['submit'])) {                
        $results = $query->where('d.name LIKE :searchTerm')
                ->setParameter('searchTerm', '%' . $search->getSearch() . '%')
                ->getQuery()
                ->getResult();

        return $this->render('AcmeBundleName:Demo:index.html.twig', [
            "form" => $form->createView(),
            "results" => $results,
            "search" => $search->getSearch(),
        ]);
    }
    return $this->redirect($request->getUri());
}

$query\Doctrine\ORM\QueryBuilder 的实例,您可以在此对象上调用 where() 等。

然后你需要调用$query->getQuery()->getResult();来执行查询。

请注意,我还删除了这条重复的行:

$em = $this->getDoctrine()->getManager('managerName');

当然可以。如果您将 querybuilder 对象分开,这是相当微不足道的。

$qb = $em->createQueryBuilder()
        ->select('d.name','d.createdAt')
        ->from('ManagerName:Demo', 'd')
        ->orderBy('d.name');

$query = $qb->getQuery();