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. 返回没有结果,空。
这是可以做到的'SELECT * FROM专家c0_ WHERE c0_.id NOT IN(SELECT c1_.specialist_id从引文c1_ WHERE c1_.user_id = 1)'。不幸的是,Doctrine不适应子查询。尽管如此,还是有解决方法。 – geoB
IMO的结果是正确的。你没有这样的专家。您在数据库中拥有的所有专家都有用户1的引用。如果添加一行“2 |”引用2 | 2 | 2'到您的引文表中,您将在结果集中获得专家2。 – Wilt
非常感谢@geoB您的查询没关系,我会用正确的代码进行更新。 http://sqlfiddle.com/#!9/e2d18/5 –