我使用Symfony 3.2和Doctrine Query Builder。我有(Users < - > roles_users < - > Roles)之间的ManyToMany关系
users(id),roles_users(role_id,user_id)和角色(id,name)。
并且只想选择roles.name ='role_client'的用户。如何使用查询生成器执行此操作?
Doctrine允许您对数据库进行抽象。您不应该考虑使用数据库表而是使用实体:您的用户实体应该具有$ roles(或者可能是diffrenet名称)属性,因此您可以在queryBuilder中使用它,如下所示:
public function findByRoleName(string $roleName)
{
return $this
->createQueryBuilder('u')
// add this to also load the related roles entities
->addSelect('r')
// Where roles is your property name in the User entity
->leftJoin('u.roles', 'r')
->where('r.name = :roleName')
->setParameter('roleName', $roleName)
->getQuery()
->getResult();
}
我在User实体的属性$ roles上进行了连接:连接表(这里是roles_users)是完全透明的!
您可以在用户存储库中创建这样的方法:
public function findByRole($roleName='role_client')
{
$query = $this->createQueryBuilder('u')
->select('u')
->leftJoin('u.role', 'r')
->addSelect('r');
$query = $query->where('r.name = :rolename')
->setParameter('rolename', $roleName)
->getQuery()
->getResult();
return $query;
}
但请确保在实体之间正确建立ORM,以便您可以轻松地将Role实体与您的User实体一起加入。
您可能需要更改“u.role”部分,因为我不知道您在用户实体中如何调用它。