有多对多关系时如何使用查询生成器选择数据?

时间:2019-04-12 07:38:43

标签: php mysql symfony doctrine query-builder

我使用Symfony 3.2和Doctrine Query Builder。 我之间有ManyToMany关系 (用户<-> roles_users <->角色)

users(id), role_users(role_id,user_id)和 角色(编号,名称)。

,并且只想选择role.name ='role_client'的那些用户。如何使用查询生成器来做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以在用户存储库中创建类似的方法:

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'部分。

答案 1 :(得分:0)

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进​​行了连接:连接表(这里是role_users)是完全透明的!