Doctrine选择通过列管理其他用户的所有用户

时间:2017-06-07 14:49:25

标签: doctrine

也许我完全错过了一些东西,但我无法让它发挥作用。我只想选择链接到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?

2 个答案:

答案 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()
;