0

I have an application with symfony2 / doctrine 2 / elastica / fosElasticaBundle / pagerFanta.

I want to use a custom and dynamic queryBuilder in combination with pagerfanta and elastica. Not to transform the results but to prefilter them.

So far I was able to : 1. Use pagerfanta by itself with my custom 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. Use Elastica with Pagerfanta but without my custom 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();
    

Now, how can I also use my custom QueryBuilder ? I know you can set a custom one in elastica config but mine has to be dynamic = take an argument, so I'd like to set it in the controller. Is that possible ?

Sébastien
  • 5,263
  • 11
  • 55
  • 116

1 Answers1

1

You can pass custom Elastica\Query to findPaginated method:

$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();

Maybe code is more clear and you can see how it works when you use just PagerFanta with ElasticaAdapter without 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();
Zdeněk Drahoš
  • 266
  • 1
  • 5
  • hmmm, I understand you use pagerfanta to paginate an elastica query. but my question is about using a custom doctrine queryBuilder in association with those two. is that even possible ? – Sébastien Feb 22 '15 at 13:42
  • I don't think so. But QueryBuilder and Elastica\Query are similar abstractions. QueryBuilder is used for Doctrine (SQL query), Elastica\Query is for ElasticSearch (JSON query). AFAIK ElasticSearch does not support SQL queries. – Zdeněk Drahoš Feb 23 '15 at 15:57