当有多对多关系时,如何使用查询生成器 select 数据?
How to select data with query builder when have many to many relations?
我使用 Symfony 3.2 和 Doctrine 查询生成器。
我之间有 ManyToMany 关系
(用户<->roles_users<->角色)
用户(id),
roles_users(role_id, user_id) 和
角色(ID,名称)。
并且只想select roles.name = 'role_client' 的用户。如何使用查询生成器做到这一点?
您可以在您的用户存储库中创建这样的方法:
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' 部分,因为我不知道您在用户实体中如何称呼它。
Doctrine 允许您对数据库进行抽象。你不应该考虑数据库 table 而应该考虑实体:你的用户实体应该有一个 $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();
}
我在用户实体的 属性 $角色上进行了连接:连接 table(这里 roles_users)是完全透明的!
我使用 Symfony 3.2 和 Doctrine 查询生成器。 我之间有 ManyToMany 关系 (用户<->roles_users<->角色)
用户(id), roles_users(role_id, user_id) 和 角色(ID,名称)。
并且只想select roles.name = 'role_client' 的用户。如何使用查询生成器做到这一点?
您可以在您的用户存储库中创建这样的方法:
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' 部分,因为我不知道您在用户实体中如何称呼它。
Doctrine 允许您对数据库进行抽象。你不应该考虑数据库 table 而应该考虑实体:你的用户实体应该有一个 $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();
}
我在用户实体的 属性 $角色上进行了连接:连接 table(这里 roles_users)是完全透明的!