在我的项目中,我使用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.app
和fos_elastica.index.app
来解决问题。
然后,当我进行查询时,Elasticsearch会对整个索引执行操作,在我的RepositoryMethod中,我添加\Elastica\Query\Type()
来按类型过滤结果。
我认为它比在特定Type上没有QueryType bu的请求效率低。不是吗?