2017-06-12 78 views
2

我有兩個主義實體類:VertriebsschieneFiliale主義不會自動加載加入使用GROUP BY關係

/** 
* Vertriebsschiene 
* 
* @ORM\Table(name="vertriebsschiene", indexes={ 
*  @ORM\Index(columns={"name"}, flags={"fulltext"}) 
* })) 
* @ORM\Entity(repositoryClass="CRMBundle\Repository\VertriebsschieneRepository") 
*/ 
class Vertriebsschiene 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=100) 
    */ 
    private $name; 



    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Filiale", mappedBy="vertriebsschiene", fetch="EAGER") 
    */ 
    private $filialen; 

    ... 
} 

/** 
* Filiale 
* 
* @ORM\Table(name="filiale") 
* @ORM\Entity(repositoryClass="CRMBundle\Repository\FilialeRepository") 
*/ 
class Filiale extends Lieferant 
{ 
    /** 
    * @var Vertriebsschiene 
    * 
    * @ORM\ManyToOne(targetEntity="CRMBundle\Entity\Vertriebsschiene", inversedBy="filialen", fetch="EAGER") 
    */ 
    private $vertriebsschiene; 

    ... 
} 

Vertriebsschine對象具有非潮頭名。現在我嘗試顯示Vertriebsschiene對象列表及其Filiale對象。

我findAllQuery方法是這樣的:

/** 
* @param User $user 
* @return \Doctrine\ORM\Query 
*/ 
public function findAllQuery(User $user){ 

    $qb = $this->createQueryBuilder('v') 
     ->select('v as vertriebsschiene') 
     ->addSelect('COUNT(f) as filial_num') 
     ->leftJoin('v.filialen', 'f') 
     ->groupBy('v.name'); 

    $this->restrictAccess($user, $qb); 

    return $qb->getQuery(); 
} 


/** 
* @param User $user 
* @param $qb 
*/ 
protected function restrictAccess(User $user, QueryBuilder &$qb) 
{ 
    if ($user->hasRole(RoleVoter::AUSSENDIENST)) { 

     $qb ->leftJoin('f.vertreter', 'u') 
      ->leftJoin('u.vertretungen', 'vx') 
      ->andWhere($qb->expr()->orX(
       'f.vertreter = :userid', 
       'f.vertreter IS NULL', 
       $qb->expr()->andX(
        'vx.proxy = :userid', 
        $qb->expr()->between(':currentDate', 'vx.start', 'vx.end') 
       ) 
      )) 
      ->setParameter('userid', $user->getId()) 
      ->setParameter('currentDate', new \DateTime(), \Doctrine\DBAL\Types\Type::DATETIME); 
    } 
} 

我的問題是,該Vertriebsschiene::$filiale陣列集合不會自動加載,但加載每個Vertriebsschiene造成許多DB連接。

這也有問題,當Vertriebsschiene::$filiale被提取時,WHERE語句被忽略。

COUNT(f)返回正確數量的Filiale對象。

我懷疑這是GROUP BY聲明的問題。

回答

4

我認爲問題是你不告訴學說選擇filiale字段。

嘗試添加filiale別名在您選擇:

public function findAllQuery(User $user){ 

    $qb = $this->createQueryBuilder('v') 
     ->select('v as vertriebsschiene', 'f') 
     ->addSelect('COUNT(f) as filial_num') 
     ->leftJoin('v.filialen', 'f') 
     ->groupBy('v.name'); 

    $this->restrictAccess($user, $qb); 

    return $qb->getQuery(); 
} 

如果在探查檢查查詢,我想你會看到,這種理論加LEFT JOIN fialiale f0_ ON v0_.id = f0_.vertriebsschiene_id(或這樣的事情,但不加SELECT ... f0_.id, f0_.xxxx

所以每當你會打電話給$vertriebsschiene->getFieliale()->getXXX()主義將有時間來執行相應的查詢來獲取分公司的數據。

+0

不,這是行不通的。但問題是,當我加入GROUPBYç lause,只有一個'filiale'被選中。 – fsteinbauer