Published on

doctrine教程4---andWhere() 和 orWhere()

原创文章,转载时需取得本人同意并注明来源
Authors
  • doctrine教程4---andWhere() 和 orWhere()
    Name
    langziyang
    Twitter

当我们在主页搜索时,url会添加?q=参数,但是结果不会变。要读取查询参数,控制器首先需要Request对象

use Symfony\Component\HttpFoundation\Request;

public function index(Request $request,CategoryRepository $categoryRepository): Response
    {
        $searchTerm = $request->query->get('q');
        if ($searchTerm) {
            $categories = $categoryRepository->search($searchTerm);
        } else {
            $categories = $categoryRepository->findAllOrdered();
        }

        return $this->render('fortune/homepage.html.twig',[
            'categories' => $categories
        ]);
    }

然后添加search方法

public function search(string $term)
    {
        return $this->createQueryBuilder('category')
            ->andWhere('category.name=:searchTerm')
            ->setParameter('searchTerm', $term)
            ->getQuery()
            ->getResult();
    }

但是一般情况下搜索是模糊查询,所以我们希望使用Like

public function search(string $term)
    {
        return $this->createQueryBuilder('category')
            ->andWhere('category.name LIKE :searchTerm')
            ->setParameter('searchTerm', '%' . $term . '%')
            ->getQuery()
            ->getResult();
    }

但是如果我们想同时也搜索iconKey呢?你可能会想用->orWhere(),但是这里你一定要注意不要这样用,相像一下我们有如下需求:

搜索(name或iconKey包含查询)并且active是true的,你可能因为代码顺序的原因导致查询条件混乱,所以请使用下面的方法:

return $this->createQueryBuilder('category')
            ->andWhere('category.name LIKE :searchTerm OR category.iconKey LIKE :searchTerm')