0

データベースのフィルターを作成しようとしています。いくつかのフォーム入力の値に基づいて、適切なクエリを作成する必要があります。これはコードです:

    $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\BlogBu​​ndle\Entity\Conferences c WHERE c.title > ITRO AND c.contactemail < somemail@yahoo.com

明らかに、クエリは適切にフォーマットされていません。私はこの投稿をフォローしていました: Doctrine DQL conditional query

何かご意見は?

4

4 に答える 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();
于 2013-01-08T12:21:54.523 に答える
0
  1. andxはすべて小文字です
  2. andxはexpr()の関数であり、クエリビルダーの関数ではありません。

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

于 2013-01-07T23:43:57.117 に答える
0

あなたの編集について:

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

doctrineを(ORMとして)使用して、オブジェクト全体を選択します。フィールドのwhere句は引き続き使用できます。また、文字列に対するgtおよびlt検索は、実際には適切なSQLプラクティスではありません。大文字と小文字が不適切な場合、奇妙な結果が生じる可能性があります。

于 2013-01-08T00:35:19.450 に答える
0

数年後、ここで私がそれを行う方法は次のとおりです。

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

これが誰かに役立つことを願っています

于 2020-05-06T02:44:35.740 に答える