我想过滤用户记录的输出。我将过滤用户,例如活动,非活动或具有分配给区域的指定角色或用户。
我在用户存储库中创建了一个函数。
public function getListBy($filter)
{
$qb = $this->createQueryBuilder('i');
$associateMapping = $this->getClassMetadata()->getAssociationMappings();
foreach ($filter as $field => $value) {
if (array_key_exists($field, $associateMapping)) {
switch ($field) {
case 'roles':
$qb->innerJoin('i.'.$field, 'r');
$qb->andWhere('r.id=:id')->setParameter('id', $value->getId());
break;
case 'wards':
$qb->innerJoin('i.'.$field, 'd');
$qb->andWhere('d.id=:id')->setParameter('id', $value->getId());
break;
}
}
return $qb->getQuery()->getResult();
}
如果我为指定的区域过滤onyl或仅为指定的角色过滤,则可行。该函数返回受影响的用户。
但是,如果我合并过滤器并过滤指定区域中具有指定角色的用户,则无法获得结果。
我的表结构的简单示例:
用户:
+----+----------+
| id | username |
+----+----------+
| 1 | testuser |
+----+----------+
作用:
+----+----------+
| id | rolename |
+----+----------+
| 1 | admin |
+----+----------+
区:
+----+------+
| id | name |
+----+------+
| 1 | ny |
+----+------+
关系表:
用户角色:
+---------+---------+
| role_id | user_id |
+---------+---------+
| 1 | 1 |
+---------+---------+
区域到用户
+-------------+---------+
| district_id | user_id |
+-------------+---------+
| 1 | 1 |
+-------------+---------+
有没有人建议我做错了什么?
更新
我收到的sql响应看起来像这样。
SELECT u0_.id AS id0,u0_.firstName AS firstName1,u0_.lastName AS lastName2,u0_.username AS username3,u0_.password AS password4,u0_.is_active AS is_active5,u0_.createDate AS createDate6,u0_.gender AS gender7,u0_.title AS title8,u0_.modifiedDate AS modifiedDate9,u0_.lastLogin AS lastLogin10,u0_.maritalStatus AS maritalStatus11,u0_.children AS children12,u0_.birthDate AS birthDate13,u0_.placeOfBirth AS placeOfBirth14,u0_.nationality AS nationality15, u0_.newUser AS newUser16 FROM user u0_ INNER JOIN user_role u2_ ON u0_.id = u2_.user_id INNER JOIN role r1_ ON r1_.id = u2_.role_id INNER JOIN user_district u4_ ON u0_.id = u4_.user_id INNER JOIN district d3_ ON d3_ .id = u4_.district_id WHERE r1_.id =? AND d3_.id =?;
如果我在我的数据库上执行此查询,则返回一个结果。但在应用程序中我没有得到结果
$qb->getQuery()->getResult()
更新2
我很绝望。现在我删除了我的存储库函数中的任何内容,只写了这一行。
public function getListBy($criteria)
{
$qb = $this->createQueryBuilder('i');
$qb->innerJoin('i.roles', 'roles');
$qb->andWhere('roles.id=:id')->setParameter('id', 9);
$qb->innerJoin('i.wards', 'wards');
$qb->andWhere('wards.id=:id')->setParameter('id', 1);
// If i execute this output in my database, i get one row as result
echo $qb->getQuery()->getSql();
// But if i count the result, it return 0
var_dump(count($qb->getQuery()->getResult()));
return $qb->getQuery()->getResult();
}
不幸的是我没有更多的想法很奇怪。有没有人遇到这个问题。
更新3,我解决了我的问题:
我的错误在于“setParameter”功能。我在switch语句中使用两种情况都使用相同的标识符来替换参数。在我不使用set参数后,一切正常。
public function getListBy($criteria)
{
$qb = $this->createQueryBuilder('i');
$qb->innerJoin('i.roles', 'roles');
$qb->andWhere('roles.id=9');
$qb->innerJoin('i.wards', 'wards');
$qb->andWhere('wards.id=1');
// If i execute this output in my database, i get one row as result
echo $qb->getQuery()->getSql();
// But if i count the result, it return 0
var_dump(count($qb->getQuery()->getResult()));
return $qb->getQuery()->getResult();
}
但我不明白为什么标识符同名的问题。 Mybe有人能解释一下这种情况吗?