2016-09-27 13 views
0

私は3つのエンティティ、User、Specialist、Citationを持っています。私のデータベースでSymfony2 Querybuilder select

Specialist.php

/** 
* 
* @ORM\OneToMany(targetEntity="Citation", mappedBy="specialist") 
*/ 
protected $citation; 

User.php

/** 
* @ORM\OneToMany(targetEntity="Citation", mappedBy="user", cascade={"remove"}) 
*/ 
protected $citation; 

Citation.php

/** 
* @ORM\ManyToOne(targetEntity="Specialist", inversedBy="citation") 
* @ORM\JoinColumn(name="specialist_id", referencedColumnName="id") 
*/ 
protected $specialist; 

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="citation") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
protected $user; 

私は、これらのレジストリを持っている:

スペシャリストテーブル:

+----------+----------------+ 
| id  | name   | 
+----------+----------------+ 
| 1  | Specialist One | 
| 2  | Specialist Two | 
+----------+----------------+ 

Userテーブル:

+----------+----------+ 
| id  | name  | 
+----------+----------+ 
| 1  | User One | 
+----------+----------+ 

引用テーブル:

+----------+--------------+---------------+---------+ 
| id  | name   | specialist_id | user_id | 
+----------+--------------+---------------+---------+ 
| 1  | Citation One | 1    | 1  | 
+----------+--------------+---------------+---------+ 

私は、ユーザー1で引用していないすべてのスペシャリストを取得する必要があります。

私はこの1つにしようとすると、SpecialistRepository.php

public function findSpecialistCitationWithUser($user) { 

    $query = $this->createQueryBuilder('s') 
     ->leftJoin('s.citation', 'c') 
     ->where('c.user = :user')->setParameter('user', $user) 
     ->getQuery() 
    ; 

    return $query->getResult(); 
} 

See it working at SQL Fiddle. 戻りSpecilistユーザーが引用されています。

私はこのQuerybuilderで成功せずにしようとしている

SpecialistRepository.php

public function findSpecialistNoCitationWithUser($user) { 

    $query = $this->createQueryBuilder('s') 
     ->leftJoin('s.citation', 'c') 
     ->where('c.user <> :user')->setParameter('user', $user) 
     ->getQuery() 
    ; 

    return $query->getResult(); 
} 

See it working at SQL Fiddle. 戻りなしの結果、空。 @geoBの助けを借りて

+0

これは 'IN(c1_.user_id =引用c1_ FROM c1_.specialist_idを選択しないc0_.idスペシャリストc0_ SELECT * FROMで行うことができます1) '。残念ながら、Doctrineはサブクエリに対応していません。しかし、このための回避策があります。 – geoB

+1

IMO結果が正しい。あなたはそのような専門家を持っていません。あなたがデータベースに持っているすべての専門家は、ユーザー1との引用をしています。 '2 |引用2 | 2 |あなたの引用表にあなたの結果セットの専門家2が得られます。 – Wilt

+0

ありがとうございます@geoBあなたの質問はOKです、私は正しいコードで更新されます。 http://sqlfiddle.com/#!9/e2d18/5 –

答えて

0

は、これが答えです:

public function findSpecialistNoCitationWithUser($user) { 

    $em = $this->getEntityManager(); 
    $rsm = new ResultSetMapping(); 
    $rsm->addEntityResult('AppBundle:Specialist', 's'); 
    $rsm->addFieldResult('s', 'id', 'id'); 
    $rsm->addFieldResult('s', 'name', 'name'); 

    $query = $em->createNativeQuery('SELECT * 
     FROM specialist c0_ 
     WHERE c0_.id NOT IN (
      SELECT c1_.specialist_id 
      FROM citation c1_ 
      WHERE c1_.user_id = 1 
     '); 

    $specialist = $query->execute(); 

    return $specialist; 

}