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 . '%')
我在下面贴了一个更详细的答案。我在下面贴了一个更详细的答案。