也许我完全错过了一些东西,但我无法让它发挥作用。我只想选择链接到User对象的User对象。
用户:
class User implements AdvancedUserInterface, \Serializable
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// other fields ...
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User")
*/
private $firstManager;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User")
*/
private $secondManager;
}
我想为用户选择firstManager或secondManager。听起来很简单呃?
我想,这样做:
public function findAllManagers()
{
$qb = $this->createQueryBuilder('user')
->join('user.firstManager', 'first_manager')
->join('user.secondManager', 'second_manager')
->orWhere('first_manager = user')
->orWhere('second_manager = user');
$qb = $qb->getQuery();
return $qb->getResult();
}
但只有一个结果,而不是我需要的全部三个结果。我认为这是有效的SQL?
答案 0 :(得分:1)
我看到你的sql查询应该是这样的:
SELECT user.* FROM user_table user
INNER JOIN user_table first_manager ON first_manager.id = user.first_manager_id
INNER JOIN user_table second_manager ON second_manager.id = user.second_manager_id
WHERE first_manager.id = user.id
OR second_manager.id = user.id
这样做的结果将是他们自己的第一或第二经理的用户。
我认为你在寻找的是:
public function findAllManagers()
{
$qb = $this->createQueryBuilder('m')
->leftJoin('u1', 'AppBundle\Entity\User', 'WITH', m = u1.firstManager)
->leftJoin('u2', 'AppBundle\Entity\User', 'WITH', m = u2.secondManager)
->where('u1.firstManager IS NOT NULL')
->orWhere('u2.secondManager IS NOT NULL')
->getQuery()
;
return $qb->getResult();
}
等效的SQL查询应该是:
SELECT m.* FROM user_table m
LEFT JOIN user_table u1 ON u1.first_manager_id = m.id
LEFT JOIN user_table u2 ON u2.second_manager_id = m.id
WHERE u1.first_manager_id IS NOT NULL
OR u2.second_manager_id IS NOT NULL
答案 1 :(得分:0)
->join()
会产生INNER JOIN
。正如您可以阅读here,这只会给出结果,即#34;在中心"。如果您有多个JOIN
,则只会提供所有这些联接表的结果。在您的情况下,这意味着用户是firstManager和secondManager。
如果您更改为->leftJoin()
,这将为您提供所有用户(附加信息),因此这是一个很好的起点。然后你可以过滤那些既不是firstManager也不是secondManager的人。
这样的事情应该有效(未经测试)
$result = $this->createQueryBuilder('user')
->leftJoin('user.firstManager', 'fm')
->leftJoin('user.secondManager', 'sm')
->where('fm.id IS NOT NULL')
->orWhere('sm.id IS NOT NULL')
->getQuery()
->getResult()
;