在服务中调用ElasticaBundle Finder和Index

时间:2017-11-15 08:50:33

标签: symfony foselasticabundle

在我的项目中,我使用FOSElastica来过滤许多实体,然后在许多页面上使用相同的代码部分:

    $query = ('' !== $request->get('q') && null !== $request->get('q')) ? $request->get('q') : null;
    $teamId = ('' !== $request->get('team') && null !== $request->get('team')) ? $request->get('team') : $this->getUser()->getFavoriteTeam()->getId();
    $page = (0 < (int) $request->get('p')) ? $request->get('p') : 1;

    $repositoryManager = $this->get('fos_elastica.manager.orm');
    $repository = $repositoryManager->getRepository('AppBundle:BiologicalOriginCategory');
    $elasticQuery = $repository->searchByNameQuery($query, $page, $teamId, $this->getUser());
    $categoryList = $this->get('fos_elastica.finder.app.biologicalorigincategory')->find($elasticQuery);
    $nbResults = $this->get('fos_elastica.index.app.biologicalorigincategory')->count($elasticQuery);

    $nbPages = ceil($nbResults / BiologicalOriginCategory::NUM_ITEMS);

在前面的代码中,唯一的变化是:用于过滤的类,有时是团队,有时是项目,有时不过滤。

我希望通过执行IndexFilter util来避免复制代码,然后,我只需调用IndexFilter服务,给他:我想要的类过滤器,queryString和用于过滤它的类。

它适用于6个第一行,因为我可以直接在我的服务中调用它。

但我不知道如何动态调用ElasticaBundle Finder和Index:

    $categoryList = $this->get('fos_elastica.finder.app.biologicalorigincategory')->find($elasticQuery);
    $nbResults = $this->get('fos_elastica.index.app.biologicalorigincategory')->count($elasticQuery);

我被迫在服务中注入它,但是有超过10个实体,我每次都不能注入20个不同的其他服务而且juste使用其中的2个......

有没有办法用类名检索Finder和Index? (AppBundle \ Entity \ BiologicalOriginCategory)?我这样做是为了检索存储库$repository = $repositoryManager->getRepository($class);并且它可以工作。

非常感谢你的帮助。

编辑: 我可能是绕过问题的解决方案,但不能使用fos_elastica.finder.appfos_elastica.index.app来解决问题。 然后,当我进行查询时,Elasticsearch会对整个索引执行操作,在我的RepositoryMethod中,我添加\Elastica\Query\Type()来按类型过滤结果。

我认为它比在特定Type上没有QueryType bu的请求效率低。不是吗?

0 个答案:

没有答案