Doctrine orm 在多对多连接表中添加innerJoin和where子句

Doctrine orm 在多对多连接表中添加innerJoin和where子句,doctrine-orm,Doctrine Orm,我有一个包含联接的现有查询: public function findClientsAndTheirUsers($user_id, $search) { $query = $this->getEntityManager()->createQueryBuilder() ->select('c.client_id, c.title, u.user_id, u.email') ->from('Application\Entity\User',

我有一个包含联接的现有查询:

  public function findClientsAndTheirUsers($user_id, $search) {
    $query = $this->getEntityManager()->createQueryBuilder()
      ->select('c.client_id, c.title, u.user_id, u.email')
      ->from('Application\Entity\User', 'u')
      ->innerJoin('u.clients', 'c')
      ->innerJoin('c.users', 'cu')
      ->andWhere("cu.user_id = {$user_id}")
      ->groupBy('c.client_id')
      ->orderBy('c.title, u.email', 'ASC');
    return $query->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
  }
在这些桌子上:

客户端

| client_id   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title       | tinytext         | NO   |     | NULL    |                |
| user_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| client_id | int(10) unsigned | NO   | PRI | NULL    |       |
/**
 * @ORM\ManyToMany(targetEntity="User", inversedBy="clients")
 * @ORM\JoinTable(name="user_has_client",
 *     joinColumns={@ORM\JoinColumn(name="client_id", referencedColumnName="client_id")},
 *     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="user_id")}
 * )
 */
protected $users;
/**
 * @ORM\Id
 * @ORM\Column(type="integer", options={"unsigned"=true})
 */
protected $user_id;

/**
 * @ORM\Id
 * @ORM\Column(type="integer", options={"unsigned"=true})
 */
protected $client_id;

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

/**
 * @ORM\ManyToOne(targetEntity="Client", inversedBy="userHasClients")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="client_id", nullable=false)
 */
protected $client;
用户

| user_id        | int(10) unsigned     | NO   | PRI | NULL    | auto_increment |
| email          | varchar(255)         | NO   | UNI | NULL    |                |
/**
 * @ORM\ManyToMany(targetEntity="Client", mappedBy="users")
 */
protected $clients;
用户拥有客户端

| client_id   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title       | tinytext         | NO   |     | NULL    |                |
| user_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| client_id | int(10) unsigned | NO   | PRI | NULL    |       |
/**
 * @ORM\ManyToMany(targetEntity="User", inversedBy="clients")
 * @ORM\JoinTable(name="user_has_client",
 *     joinColumns={@ORM\JoinColumn(name="client_id", referencedColumnName="client_id")},
 *     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="user_id")}
 * )
 */
protected $users;
/**
 * @ORM\Id
 * @ORM\Column(type="integer", options={"unsigned"=true})
 */
protected $user_id;

/**
 * @ORM\Id
 * @ORM\Column(type="integer", options={"unsigned"=true})
 */
protected $client_id;

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

/**
 * @ORM\ManyToOne(targetEntity="Client", inversedBy="userHasClients")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="client_id", nullable=false)
 */
protected $client;
与这些实体合作:

客户端

| client_id   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title       | tinytext         | NO   |     | NULL    |                |
| user_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| client_id | int(10) unsigned | NO   | PRI | NULL    |       |
/**
 * @ORM\ManyToMany(targetEntity="User", inversedBy="clients")
 * @ORM\JoinTable(name="user_has_client",
 *     joinColumns={@ORM\JoinColumn(name="client_id", referencedColumnName="client_id")},
 *     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="user_id")}
 * )
 */
protected $users;
/**
 * @ORM\Id
 * @ORM\Column(type="integer", options={"unsigned"=true})
 */
protected $user_id;

/**
 * @ORM\Id
 * @ORM\Column(type="integer", options={"unsigned"=true})
 */
protected $client_id;

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

/**
 * @ORM\ManyToOne(targetEntity="Client", inversedBy="userHasClients")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="client_id", nullable=false)
 */
protected $client;
用户

| user_id        | int(10) unsigned     | NO   | PRI | NULL    | auto_increment |
| email          | varchar(255)         | NO   | UNI | NULL    |                |
/**
 * @ORM\ManyToMany(targetEntity="Client", mappedBy="users")
 */
protected $clients;
UserHasClient

| client_id   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title       | tinytext         | NO   |     | NULL    |                |
| user_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| client_id | int(10) unsigned | NO   | PRI | NULL    |       |
/**
 * @ORM\ManyToMany(targetEntity="User", inversedBy="clients")
 * @ORM\JoinTable(name="user_has_client",
 *     joinColumns={@ORM\JoinColumn(name="client_id", referencedColumnName="client_id")},
 *     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="user_id")}
 * )
 */
protected $users;
/**
 * @ORM\Id
 * @ORM\Column(type="integer", options={"unsigned"=true})
 */
protected $user_id;

/**
 * @ORM\Id
 * @ORM\Column(type="integer", options={"unsigned"=true})
 */
protected $client_id;

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

/**
 * @ORM\ManyToOne(targetEntity="Client", inversedBy="userHasClients")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="client_id", nullable=false)
 */
protected $client;
现在,我刚刚在
user\u has\u client
表中添加了一个
roles
列:

| user_id   | int(10) unsigned | NO   | PRI | NULL    |       |
| client_id | int(10) unsigned | NO   | PRI | NULL    |       |
| roles     | tinytext         | YES  |     | NULL    |       |

我想更新查询,以便它只返回那些具有管理员角色的用户。

我认为您需要这样的功能(未经测试,DQL不是我的强项):

您需要在DQL中使用manytone和OneToMany以及UserHasClient实体来获取角色


我希望这为您指明了正确的方向。

我认为您需要这样的东西(未经测试,DQL不是我的强项):

您需要在DQL中使用manytone和OneToMany以及UserHasClient实体来获取角色


我希望这为您指明了正确的方向。

试试这个,希望它能帮上忙-

public function findClientsAndTheirUsers($user_id, $search)
{
    $query = $this->getEntityManager()->createQueryBuilder()
            ->select('c.client_id, c.title, u.user_id, u.email')
            ->from('Application\Entity\User', 'u')
            ->innerJoin('u.userHasClients', 'uhc')
            ->innerJoin('uhc.client', 'c')
            ->where("u.user_id = {$user_id}")
            ->andWhere("uhc.roles = :role")->setParameter('role', $role)
            ->groupBy('c.client_id')
            ->orderBy('c.title, u.email', 'ASC');
    return $query->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
}

如果您仍然遇到问题,请告诉我。

试试这个,希望对您有所帮助-

public function findClientsAndTheirUsers($user_id, $search)
{
    $query = $this->getEntityManager()->createQueryBuilder()
            ->select('c.client_id, c.title, u.user_id, u.email')
            ->from('Application\Entity\User', 'u')
            ->innerJoin('u.userHasClients', 'uhc')
            ->innerJoin('uhc.client', 'c')
            ->where("u.user_id = {$user_id}")
            ->andWhere("uhc.roles = :role")->setParameter('role', $role)
            ->groupBy('c.client_id')
            ->orderBy('c.title, u.email', 'ASC');
    return $query->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
}

如果仍然有问题,请告诉我。

多亏了Gautam Rai的回答,我可以在我的用户类中编写缺少的映射:

/**
 * @ORM\OneToMany(targetEntity="UserHasClient", mappedBy="user")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id", nullable=true)
 */
protected $userHasClients;

public function __construct()
{
    $this->userHasClients = new ArrayCollection();
}

/**
 * Add UserHasClient entity to collection (one to many).
 *
 * @param \Application\Entity\UserHasClient $userHasClient
 * @return \Application\Entity\User
 */
public function addUserHasClient(UserHasClient $userHasClient)
{
  $this->userHasClients[] = $userHasClient;

  return $this;
}

/**
 * Get UserHasClient entity collection (one to many).
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getUserHasClients()
{
  return $this->userHasClients;
}
然后就可以将实体从用户遍历到其角色和客户端:

->from('Application\Entity\User', 'u')
->innerJoin('u.userHasClients', 'uhc')
->innerJoin('uhc.client', 'c')
->andWhere("uhc.roles like :role")
->setParameter('role', '%' . $role . '%')

感谢Gautam Rai的回答,我可以在我的用户类中编写缺少的映射:

/**
 * @ORM\OneToMany(targetEntity="UserHasClient", mappedBy="user")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id", nullable=true)
 */
protected $userHasClients;

public function __construct()
{
    $this->userHasClients = new ArrayCollection();
}

/**
 * Add UserHasClient entity to collection (one to many).
 *
 * @param \Application\Entity\UserHasClient $userHasClient
 * @return \Application\Entity\User
 */
public function addUserHasClient(UserHasClient $userHasClient)
{
  $this->userHasClients[] = $userHasClient;

  return $this;
}

/**
 * Get UserHasClient entity collection (one to many).
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getUserHasClients()
{
  return $this->userHasClients;
}
然后就可以将实体从用户遍历到其角色和客户端:

->from('Application\Entity\User', 'u')
->innerJoin('u.userHasClients', 'uhc')
->innerJoin('uhc.client', 'c')
->andWhere("uhc.roles like :role")
->setParameter('role', '%' . $role . '%')

我在下面贴了一个更详细的答案。我在下面贴了一个更详细的答案。