查询访问存储库而不返回数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询访问存储库而不返回数据相关的知识,希望对你有一定的参考价值。

Symfony / Doctrine - 存储库不返回数据。

我之前已成功从另一个实体/存储库检索数据,但似乎无法从此特定存储库获取数据。我已经在控制台中清除了缓存,并且已经使用实体类(带注释)注册了存储库。

测试DQL作为SQL按预期返回结果,这意味着传递给查询的参数将通过SQL查询返回我想要的结果,而不是DQL查询。

与过去成功的存储库查询相比,访问此存储库的路由之间的一个区别是“参数包”正在通过此存储库中的请求“属性”传递,并且在成功的先前存储库查询中,查询参数通过请求传递“查询 - 参数袋“在请求中。我不确定它甚至是存储库查询问题的一部分。

控制器

/**
 * Open the modal dialog for selecting strip width
 * @Route("/select/{materialId}/{gaugeId}/{rangeUpper}/{rangeLower}", defaults={"materialId" = 0, "gaugeId" = 0, "rangeUpper" = 0, "rangeLower" = 0}, name="material-stock_selectWidth")
 * @Method("GET")
 */
public function selectStripWidthAction (Request $request)
{
    $em = $this->getDoctrine()->getManager();

    $materialStocks = $em->getRepository('UniflyteBundle:MaterialStock')->findAllByParams($request);



    return $this->render('materialstock/dialog/select.html.twig', [
        'MaterialStock' => $materialStocks,
    ]);
}

存储库

public function findAllByParams (Request $request)
{

    $criteria = $request->query->get('uniflytebundle_material-stock_selectWidth');

    $criteria = ($request->get('materialId') == 0 ? [] : ['materialId' => $request->get('materialId')]);
    $criteria = array_merge(($request->get('gaugeId') == 0 ? [] : ['gaugeId' => $request->get('gaugeId')]), $criteria);
    $criteria = array_merge(($request->get('rangeUpper') == 0 ? [] : ['rangeUpper' => $request->get('rangeUpper')]), $criteria);
    $criteria = array_merge(($request->get('rangeLower') == 0 ? [] : ['rangeLower' => $request->get('rangeLower')]), $criteria);
    $criteria = array_filter($criteria);

    $query = $this->createQueryBuilder('ms');

    if (!empty($criteria)) {
        if (!empty($criteria['materialId']) && !empty($criteria['gaugeId']) && !empty($criteria['rangeUpper']) && !empty($criteria['rangeLower'])) {
            $query
              ->where('ms.material = :materialId')
              ->andWhere('ms.gauge = :gaugeId')
              ->andWhere('ms.widthDecimal <= :upperIdentifier')
              ->andWhere('ms.widthDecimal >= :lowerIdentifier')
              ->setParameter('materialId', $criteria['materialId'])
              ->setParameter('gaugeId', $criteria['gaugeId'])
              ->setParameter('upperIdentifier', $criteria['rangeUpper'])
              ->setParameter('lowerIdentifier', $criteria['rangeLower'])
            ;
        }
    }
    return $query->orderBy('ms.widthDecimal', 'DESC');
}

显示结果

<select>
    {% for MaterialStock in MaterialStock %}
        <option>{{ MaterialStock.widthDecimal }}</option>
    {% endfor %}
</select>

来自控制器的dump()显示queryBuilder。

MaterialStockController.php on line 139:
array:1 [▼
"materialStocks" => QueryBuilder {#613 ▼
-_em: EntityManager {#757 …11}
-_dqlParts: array:9 [▼
  "distinct" => false
  "select" => array:1 [▶]
  "from" => array:1 [▶]
  "join" => []
  "set" => []
  "where" => Andx {#642 ▼
    #separator: " AND "
    #allowedClasses: array:4 [▶]
    #preSeparator: "("
    #postSeparator: ")"
    #parts: array:4 [▼
      0 => "ms.material = :materialId"
      1 => "ms.gauge = :gaugeId"
      2 => "ms.widthDecimal <= :upperIdentifier"
      3 => "ms.widthDecimal >= :lowerIdentifier"
    ]
  }
  "groupBy" => []
  "having" => null
  "orderBy" => array:1 [▶]
]
-_type: 0
-_state: 0
-_dql: null
-parameters: ArrayCollection {#646 ▼
  -elements: array:4 [▼
    0 => Parameter {#645 ▼
      -name: "materialId"
      -value: "1"
      -type: 2
    }
    1 => Parameter {#644 ▼
      -name: "gaugeId"
      -value: "7"
      -type: 2
    }
    2 => Parameter {#648 ▼
      -name: "upperIdentifier"
      -value: "3.75"
      -type: 2
    }
    3 => Parameter {#643 ▼
      -name: "lowerIdentifier"
      -value: "3.5"
      -type: 2
    }
  ]
}
-_firstResult: null
-_maxResults: null
-joinRootAliases: []
#cacheable: false
#cacheRegion: null
#cacheMode: null
#lifetime: 0

} ]

在实体类中注册存储库

@ORMEntity(repositoryClass="UniflyteBundleRepositoryMaterialStockRepository")

我在这做错了什么?

我很感激投入这一挑战的任何时间/精力/想法/建议。先感谢您。

答案

你有查询,但没有得到结果。 findAllByParams方法看起来应该是这样的:

public function findAllByParams ($arguments)
{

  //quuery building goes here
  // ...
  $query->orderBy('ms.widthDecimal', 'DESC');
  return $query->getQuery()->getResult()
}

不要将Request传递给存储库方法,在外部获取参数(并验证它们),例如,在控制器中。

另一答案

我想你错过了这个:->getQuery()->getResult()(这返回了querybuilder的数据)在findAllByParams函数的返回中(在查询构建器上)。希望能帮助到你!

以上是关于查询访问存储库而不返回数据的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Spring Boot 中测试我的存储库而不实际将测试数据保存在数据库中吗?

合并两个 Git 存储库而不破坏文件历史记录

管理项目不可知代码库而不创建依赖项

从自定义查询返回模型而不访问数据库

从“node_modules”以外的位置引用 NodeJS 库而不使用相对路径

返回IQueryable表达式而不执行数据库查询