2016-09-27 70 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 | 
+----------+----------------+ 

用户表:

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

引用表:

+----------+--------------+---------------+---------+ 
| id  | name   | specialist_id | user_id | 
+----------+--------------+---------------+---------+ 
| 1  | Citation One | 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. 返回没有结果,空

+0

这是可以做到的'SELECT * FROM专家c0_ WHERE c0_.id NOT IN(SELECT c1_.specialist_id从引文c1_ WHERE c1_.user_id = 1)'。不幸的是,Doctrine不适应子查询。尽管如此,还是有解决方法。 – geoB

+1

IMO的结果是正确的。你没有这样的专家。您在数据库中拥有的所有专家都有用户1的引用。如果添加一行“2 |”引用2 | 2 | 2'到您的引文表中,您将在结果集中获得专家2。 – Wilt

+0

非常感谢@geoB您的查询没关系,我会用正确的代码进行更新。 http://sqlfiddle.com/#!9/e2d18/5 –

回答

0

与@geoB的帮助,这就是答案:

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; 

}