Symfony fetchAll by filter

时间:2014-10-06 11:26:24

标签: symfony

我想过滤用户记录的输出。我将过滤用户,例如活动,非活动或具有分配给区域的指定角色或用户。

我在用户存储库中创建了一个函数。

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有人能解释一下这种情况吗?

0 个答案:

没有答案