构建动态的学说查询

问题描述 投票:0回答:4

我正试图为我的数据库建立过滤器。基于几个表单输入的值,我需要构建适当的查询。这是我的代码。

    $qb = $em->createQueryBuilder();
            $qb->select('c.title')
            ->from('Baza\BlogBundle\Entity\Conferences', 'c');         
    $conditions=array(
        $qb->expr()->gt('c.title',$enquiry->getNaziv()) );//First condition 

    if ($enquiry->getKontakt()!=null) {
         $conditions[] = $qb->expr()->lt('c.contactemail',$enquiry->getKontakt())}//Adding second, optional condition

    $conditions = call_user_func_array(array($qb, 'andX'), $conditions);
    $qb->where($conditions);
    $query = $qb->getQuery();

当我运行这段代码时,我得到了以下异常。

警告:call_user_func_array()期望参数1是一个有效的回调,类'Doctrine\ORM\QueryBuilder'没有一个方法'andX'。

*在修改了call_user_func_array()之后,我得到了以下错误。

QueryException: SELECT c.title FROM Baza\BlogBundle\Entity/Conferences c WHERE c.title > ITRO AND c.contactemail < [email protected]

很明显,查询的格式不太对。我是按照这个帖子来的。道理DQL的条件查询

有什么想法吗?

symfony doctrine
4个回答
2
投票

我用以下代码构建了动态查询。

$em = $this->getDoctrine()->getEntityManager();

            $naziv = $enquiry->getNaziv();
            $drzava=$enquiry->getDrzava();
            $oblast=$enquiry->getOblast();
            $grad=$enquiry->getGrad();
            $provincija=$enquiry->getProvincija();
            $kontakt=$enquiry->getKontakt();
            $sajt=$enquiry->getSajt();

            $testquery = "SELECT c.title FROM Baza\BlogBundle\Entity\Conferences c JOIN c.topicid t JOIN c.locationid l JOIN l.stateid s WHERE c.lh = :lh";
            $testparam ['lh'] = $lh;

            if ($kontakt != '') {
                    $testquery .= " and c.contactemail = :kontakt";
                    $testparam['kontakt'] = $kontakt;
            }
            if ($drzava != '') {
                    $testquery .= " and s.name = :drzava";
                    $testparam['drzava'] = $drzava;
            }

            if ($provincija != '') {
                    $testquery .= " and l.province = :provincija";
                    $testparam['provincija'] = $provincija;
            }

             if ($grad != '') {
                    $testquery .= " and l.city = :grad";
                    $testparam['grad'] = $grad;
            }

             if ($sajt != '') {
                    $testquery .= " and c.siteurl = :sajt";
                    $testparam['sajt'] = $sajt;
            }

             if ($oblast != '') {
                    $testquery .= " and t.name = :oblast";
                    $testparam['oblast'] = $oblast;
            }

            $query = $em->createQuery($testquery)->setParameters($testparam);
            $result = $query->getResult();

0
投票
  1. andx全部为小写
  2. andx是expr()的函数,不是查询生成器的函数。

    $conditions = call_user_func_array(array(array($qb->expr(), 'andx'), $conditions);


0
投票

关于你的编辑。

$qb = $em->createQueryBuilder();
            $qb->select('c')
            ->from('Baza\BlogBundle\Entity\Conferences', 'c');

使用doctrine(作为一个ORM)来选择整个对象。 你仍然可以在字段上使用where子句。 另外,gt和lt在字符串上的搜索并不是真正正确的sql实践。 它们很可能会产生不正确的字母大小写的奇怪结果。


0
投票

多年后,我是这样做的。

    if (array_key_exists('phone', $filters)) {
        $qb->andWhere('p.phone LIKE :phone')
        ->setParameter(':phone', '%' . $filters['phone'] . '%');
    }

希望这对别人有帮助

© www.soinside.com 2019 - 2024. All rights reserved.