我有三个表:
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/