php - 如何使用 Doctrine 在 Symfony 中创建查询,从三个相关表中提取数据

标签 php mysql symfony doctrine-orm

我有三个表:

users(id, firstName, lastName)
user_role(userId, roleId)
roles(id, role, userId)

我还有基于这些表的相应实体,在 Symfony 中生成:

users (id, firstName, lastName, user_role[])
user_role (users, roles)
roles (id, role)

当我进行以下查询时,它可以正常工作:

public function getAllUsers() {
        $query = $this->getEntityManager()
            ->createQuery('
              SELECT users_.firstName FROM MyApp:users users_
        ');
        $result = $query->getArrayResult();
        dump($result);
    }



Result:



 array:2 [▼
  0 => array:1 [▼
    "firstName" => "Paul"
  ]
  1 => array:1 [▼
    "firstName" => "John"
  ]
]

但是当我要加入实体用户 JOIN user_roles JOIN 角色时, 结果如下:

$query = $this->getEntityManager()
            ->createQuery('
              SELECT users_.firstName, r.role FROM MyApp:users users_
              JOIN users_.user_role ur
              JOIN  ur.roles r
        ');
        $result = $query->getArrayResult();
        dump($result);

Result:

    array:2 [▼
  0 => array:2 [▼
    "firstName" => "Paul"
    "role" => "admin"
  ]
  1 => array:2 [▼
    "firstName" => "Paul"
    "role" => "user"
  ]
]

应该是这样:

array:2 [▼
      0 => array:2 [▼
        "firstName" => "Paul"
        "role" => "admin"
      ]
      1 => array:2 [▼
        "firstName" => "John"
        "role" => "user"
      ]
    ]

我哪里错了? 我怎样才能正确地做出来呢? 谢谢!

最佳答案

首先,我建议使用 QueryBuilder(如 Kero 提出的)来执行此类简单任务,以最大程度地减少查询本身的语法错误数量;

$query = $entityManager->createQueryBuilder()
    ->select('u.name name', 'r.role role')
    ->from(User::class, 'u')
    ->join('u.user_role', 'ur')
    ->join('ur.role', 'r')
    ->getQuery();

$result = $query->getResult(Query::HYDRATE_ARRAY);

如果输出的数据不正确,我敢打赌您数据库中的数据同样不正确,问题出在其他地方。

其次,你有“UserRole”实体也有点奇怪(我想,否则你不需要在查询中加入它),Doctrine应该自己处理多对多关系及其链接表,或者我错过了什么?

关于php - 如何使用 Doctrine 在 Symfony 中创建查询,从三个相关表中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43884776/

相关文章:

mysql - Laravel 条件查询不起作用

Symfony2 : Is it possible to add configuration for another bundle via DependencyInjection?

c# - MySql 内连接,如果值等于 0,则为 "OR"

php - 尝试在函数内插入数据库时​​出错

php - Shopware 6插件: How to Remove/Migrate boolean config to multi-select config

php - Symfony/Doctrine 排名

php - 使用 file_get_contents() 加载远程 xml 页面

php - 显示数据库中的数据

javascript - 无法从 AngularJS 数据中进行 NG-Repeat 数组(英雄联盟)

PHP:第二个查询不起作用