0

我有一个带有 symfony2 / 学说 2 / elastica / fosElasticaBundle / pagerFanta 的应用程序。

我想将自定义和动态 queryBuilder 与 pagerfanta 和 elastica 结合使用。不是转换结果,而是预过滤它们。

到目前为止,我能够: 1. 将 pagerfanta 与我的自定义 queryBuilder 一起使用:

    $page = $request->get('page', 1);
    $search = $request->get('search');
    $querybuilder = $this->getDoctrine()->getRepository('AppBundle:FoodAnalytics\Recipe')->findByTopCategoryQueryBuilder($category);
    $explorerManager = $this->get('explorer_manager');
    $pagerFanta = $explorerManager->getPagerFanta($querybuilder, $page, 4);
    $recipes = $pagerFanta->getCurrentPageResults();
  1. 将 Elastica 与 Pagerfanta 一起使用,但没有我的自定义 QueryBuilder :

    $page = $request->get('page', 1);
    $search = $request->get('search');
    $finder = $this->container->get('fos_elastica.finder.website.recipe');
    $pagerFanta = $finder->findPaginated($search);
    $recipes = $pagerFanta->getCurrentPageResults();
    

现在,我怎样才能使用我的自定义 QueryBuilder ?我知道你可以在 elastica 配置中设置一个自定义的,但我的必须是动态的 = 带一个参数,所以我想在控制器中设置它。那可能吗 ?

4

1 回答 1

1

您可以将自定义 Elastica\Query 传递给findPaginated方法:

$query = new \Elastica\Query::create(new \Elastica\Query\Term(array(
    'name' => $request->get('search')
));
$finder = $this->container->get('fos_elastica.finder.website.recipe');
$pagerFanta = $finder->findPaginated($query);
$recipes = $pagerFanta->getCurrentPageResults();

也许代码更清晰,当您仅使用PagerFanta 和 ElasticaAdapter而没有 FOSElasticaBundle时,您可以看到它是如何工作的:

// Searchable can be any valid searchable Elastica object. For example a Type or Index
$finder = new \Elastica\Index($elasticaClient, 'website.recipe');
// A Query can be any valid Elastica query (json, array, Query object)
$query = new \Elastica\Query::create(new \Elastica\Query\Term(array(
    'name' => $request->get('search')
));

$elasticaAdapter = new \Pagerfanta\Adapter\ElasticaAdapter($finder, $query);
$paginator = new \Pagerfanta\Pagerfanta($elasticaAdapter);
$results = $paginator
                ->setMaxPerPage($limit)
                ->setCurrentPage($page)
                ->getCurrentPageResults();
于 2015-02-20T18:52:15.140 回答