Doctrine和Symfony2:WHERE a.title LIKE $ array

时间:2013-09-05 10:35:44

标签: php sql symfony doctrine-orm doctrine

嘿,我正在撰写这篇文章,因为我在教条查询中传递数组值的问题很少。

以下是整个查询:

$data = $request->request->all();
$dql   = "SELECT a FROM PfBlogBundle:Article a WHERE a.title LIKE '{$data['search']}' ORDER by a.id DESC";

如果我print_r($ data)我得到了值,所以它就在某处。我只是不明白为什么它没有传递查询..期待LIKE'{$ data ['search']}'工作,但事实并非如此。

2 个答案:

答案 0 :(得分:18)

从你的代码片段我可以看出,你正在寻找这样的东西:

$entityManager->getRepository('PfBlogBundle:Article')
              ->findBy(
                   array(
                      'key' => 'value'
                   )
               );

其中key是属性/字段,值是要查找的值。查看Symfony手册页。你所追求的是Fetching Objects from the Database 在where子句refer to this SO question中使用like,了解如何使用setParameter。你会得到你的疑问:

$repo = $entityManager->getRepository('PfBlogBundle:Article');
$query = $repo->createQueryBuilder('a')
               ->where('a.title LIKE :title')
               ->setParameter('title', '%'.$data['search'].'%')
               ->getQuery();

当然,添加通配符可满足您的需求。我已将$data['search']值括在两个%通配符中,这很慢,但又一次:我不知道你在做什么。可能是你所追求的只是LIKE的不区分大小写的性质,在这种情况下%可以一起排除......

根据您之前的问题(顺便说一下:考虑偶尔接受一个答案):

public function searchAction(Request $request)
{
    $data = $request->get->all();
    $repo = $this->getDoctrine()
                  ->getRepository('PfBlogBundle:Article');
    $query = $repo->createQueryBuilder('a')
                   ->where('a.title LIKE :title')
                   ->setParameter('title', '%'.$data['search'].'%')
                   ->getQuery();
    $paginator  = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $query->getResults(),//get the results here
        $this->requrest->get('page',1),
        4
    );
    return $this->render('PfBlogBundle:Default:blog.html.twig', array('pagination'=>$pagination));
}

但这只是一个粗略的修复,Google doctrine-symfony pagination,有很多关于此事的详细博客帖子

答案 1 :(得分:0)

所以我回过头来讨论这个话题。以下是想要尝试与我一样的人的答案。我在这里的回答是基于Elias Van Ootegem的提示,但我不得不做一些小改动。所以我写了控制器解决方案:

    public function searchAction(Request $request)
{
    $data = $request->get->all();
    $repo = $this->getDoctrine()
                  ->getRepository('PfBlogBundle:Article');
    $query = $repo->createQueryBuilder('a')
                   ->where('a.title LIKE :title')
                   ->setParameter('title', '%'.$data['search'].'%')
                   ->getQuery();
    $paginator  = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $query->getResults(),//get the results here
        $this->request->get('page',1),
        4
    );
    return $this->render('PfBlogBundle:Default:blog.html.twig', array('pagination'=>$pagination));
}

因为分页正在使用get方法,所以我不得不改变表单的方法以获得...然后,这使我在Elias代码中更改此行:

$data = $request->request->all();

$data = $request->get->all();

希望它对某人有帮助!