【问题标题】:Doctrine2 Multiple Join works with createQuery but not with queryBuilderDoctrine2 Multiple Join 适用于 createQuery 但不适用于 queryBuilder
【发布时间】:2012-02-26 23:24:25
【问题描述】:

如果我在不使用 queryBuilder 的情况下使用此 dql 进行查询

$query = $this->_em
  ->createQuery("SELECT p, g, c
            FROM LikeYeah\GoBundle\Entity\Product p
            JOIN p.garments g
            LEFT JOIN g.colours c
            ORDER BY p.id DESC
          ");

一切都很好,但是如果我使用(我相信是一样的)这样的查询生成器查询槽

 $qb->select('p, g, c')
    ->from('LikeYeah\GoBundle\Entity\Product', 'p')
    ->join('p.garments', 'g')
    ->leftJoin('g.colours', 'c')
    ->orderBy('p.id', 'desc');

我收到以下错误:

“语义错误] line 0, col 66 near '.colours c, LikeYeah\GoBundle\Entity\Product':错误:标识变量 g 用于连接路径表达式,但之前未定义。”

我错过了什么?

【问题讨论】:

  • 我在文档中看不到“join”,只有“leftJoin”和“innerJoin”。也许问题是你的“加入”实际上是一个leftJoin,对于某些行它没有定义“g”,因为没有什么可以加入......
  • Wojciech,不是这样,QueryBuilder 有一个名为join() 的方法,基本上是innerJoin() 的别名。

标签: php symfony doctrine-orm dql


【解决方案1】:

可以试试

  $qb->select('p, g, c')
     ->from('GoBundle:Product', 'p')
     ->join('p.garments', 'g')
     ->leftJoin('g.colours', 'c')
     ->orderBy('p.id', 'desc');

显示您的 $qb 初始化和 DQL 结果

【讨论】:

    【解决方案2】:

    你可以从这个方法中得到帮助

     public function findSampleClothingTypeGender($gender) {
            $query = $this->getEntityManager()
                            ->createQuery('
                SELECT p FROM Acme:Product p 
                JOIN p.clothing_type ct
                WHERE p.gender = :gender'
                            )->setParameter('gender', $gender);
    
            try {
                return $query->getResult();
            } catch (\Doctrine\ORM\NoResultException $e) {
                return null;
            }
        }
    

    【讨论】:

      【解决方案3】:

      它对我有用。

      $this->_em->createQueryBuilder()
               ->select('fu,e,t')
               ->from('\xxxx\AdminBundle\Entity\FrontUser','fu')
               ->join('fu.read_essays','e')
               ->leftJoin('e.tags','t')
               ->getQuery()->execute();
      

      我认为你应该创建一个新的 QueryBuilder 对象。

      您可以使用以下代码查看该 QueryBuilder 的 Dql

      $qb->getDQL();

      【讨论】:

        【解决方案4】:

        试试这个:加入后使用 addSelect:

         $qb->select('p')
            ->join('p.garments', 'g')
            ->addSelect('g')
            ->from('LikeYeah\GoBundle\Entity\Product', 'p')
            ->join('p.garments', 'g')
            ->leftJoin('g.colours', 'c')
            ->addSelect('c')
            ->orderBy('p.id', 'desc');
        

        【讨论】:

          【解决方案5】:

          试试下面的一个

           $qb->select('p','g','c')
                ->from(array('LikeYeah\GoBundle\Entity\Product','p'))
                ->join(array('p.garments','g'))   
                ->join(array('g.colours','c'),'LEFT')
                ->order_by('p.id','DESC'); 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-31
            • 2020-11-23
            相关资源
            最近更新 更多