如何在多对多关系中使用查询构建器选择数据?

问题描述 投票:-1回答:2

我使用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'的用户。如何使用查询生成器执行此操作?

php mysql symfony doctrine query-builder
2个回答
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上进行了连接:连接表(这里是roles_users)是完全透明的!


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”部分,因为我不知道您在用户实体中如何调用它。

© www.soinside.com 2019 - 2024. All rights reserved.