/** * Recherche avancée * * @ApiDoc( * resource = true, * description = "Recherche avancée", * statusCodes = { * 200 = "Returned when successful", * 404 = "Returned when the data is not found" * } * ) * @Route("/api/search/advancedSearch",name="nicetruc_advanced", options={"expose"=true}) * @Rest\View() * @Method({"POST"}) */ public function searchAdvancedAction(Request $request) { $elasticManager = $this->get('fos_elastica.manager'); $advancedSearch = new AdvancedSearch(); $advancedSearch->handleRequest($request); $voitures = $elasticManager->getRepository('AppBundle:Voiture')->searchAdvanced($advancedSearch); $view = View::create(); if ($voitures) { $data = array('data' => array('voitures' => $voitures)); $view->setData($data)->setStatusCode(200); } else { $view->setData(null)->setStatusCode(404); } return $view; }
public function searchAdvanced(AdvancedSearch $advancedSearch) { if (!$advancedSearch->innerObjectIsDefine()) { $match = new \Elastica\Query\MatchAll(); } else { $match = new \Elastica\Query\BoolQuery(); if ($advancedSearch->getMarque()) { $match->addMust(new \Elastica\Query\Match('modeleMarque.marque.id', $advancedSearch->getMarque())); } if ($advancedSearch->getModele()) { $match->addMust(new \Elastica\Query\Match('modeleMarque.modele.id', $advancedSearch->getModele())); } if ($advancedSearch->getBoitier()) { $match->addMust(new \Elastica\Query\Match('boitier.id', $advancedSearch->getBoitier())); } if ($advancedSearch->getCarburant()) { $match->addMust(new \Elastica\Query\Match('carburant.id', $advancedSearch->getCarburant())); } } $boolFilter = new \Elastica\Filter\BoolFilter(); if ($advancedSearch->getPrixMin()) { $boolFilter->addMust(new \Elastica\Filter\Range('prix', array('gte' => intval($advancedSearch->getPrixMin())))); } if ($advancedSearch->getPrixMax()) { $boolFilter->addMust(new \Elastica\Filter\Range('prix', array('lte' => $advancedSearch->getPrixMax()))); } if ($advancedSearch->getKmMin()) { $boolFilter->addMust(new \Elastica\Filter\Range('kmParcouru', array('gte' => intval($advancedSearch->getKmMin())))); } if ($advancedSearch->getKmMax()) { $boolFilter->addMust(new \Elastica\Filter\Range('kmParcouru', array('lte' => $advancedSearch->getKmMax()))); } $filtered = new \Elastica\Query\Filtered($match, $boolFilter); $query = \Elastica\Query::create($filtered); return $this->find($query); }