Je veux créer un filtre de recherche dans un Repository
<?php
namespace App\Repository;
use App\Entity\Contacts;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
/**
* @method Contacts|null find($id, $lockMode = null, $lockVersion = null)
* @method Contacts|null findOneBy(array $criteria, array $orderBy = null)
* @method Contacts[] findAll()
* @method Contacts[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class ContactsRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Contacts::class);
}
/**
* @return Contacts[] Returns an array of Contacts objects
*/
public function searchContact($criteria)
{
return $this->createQueryBuilder('c')
->leftJoin('c.circo', 'circo')
->where('c.circo = :circo')
->setparameter("circo", $criteria['circo']->getCirco())
->andWhere('c.tracteur = :tracteur')
->setParameter('tracteur', $criteria['tracteur'])
->andWhere('c.colleur = :colleur')
->setParameter('colleur', $criteria['colleur'])
->andWhere('c.voiture = :voiture')
->setParameter('voiture', $criteria['voiture'])
//->orderBy('c.nom', 'ASC')
->getQuery()
->getResult()
;
}
J'appelle la fonction dans mon controler
<?php
namespace App\Controller;
use App\Form\SearchContactType;
use App\Repository\ContactsRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SearchController extends AbstractController
{
/**
* @Route("/search", name="search")
*/
public function search(Request $request, ContactsRepository $ContactsRepository)
{
$searchform = $this->createForm(SearchContactType::class);
if($searchform->handleRequest($request)->isSubmitted() && $searchform->isValid()) {
$criteria = $searchform->getData();
$contacts = $ContactsRepository->searchContact($criteria);
dd($criteria);
}
return $this->render('search/search.html.twig', [
'searchform' => $searchform->createView()
]);
}
}
Ce que j'obtiens
Un message d'erreur :
Call to a member function getCirco() on int
qui indique que l'erreur est à la ligne 31 du Repository.
J'ai beau chercher, je ne vois pas de solution ...
Quelqu'un aurait-il l'obligeance de m'aider à trouver la solution ... ?
Merci d'avance à ceux qui me répondront.
Bonjour aka-aka,
En fait l'objectif était de faire une requête à choix multiples, pas dans le controller, mais dans le repository (bonnes pratiques).
J'ai donc créé une classe non mappée (pas liée à l'ORM).
Ma difficulté était un problème de syntaxe dans le repository. C'est résolu. Et ça fonctionne.
Pour répondre à ta question sur le bout de code ci-dessus, cela me permet de récupérer un INT depuis un formulaire de recherche (filtre multi critères).
Une fois cet integer récupéré, je cherche dans tous les enregistrements ceux qui ont cette propritété (int) + les options supplémentaires souhaitées
sélectionnées ensuite dans le formulaire et je renvoie le résultat au contrôleur pour affichage dans la vue.
Effectivement tu arrives trop tard, mais merci d'avoir répondu pour m'aider. C'est sympa.
Bonnes fêtes de fin d'année.
Bonjour,
il est peut-être un peut tard mais ton erreur doit se trouver dans ton entity.
Est tu sur d'avoir " getCirco() " dans ton Entity Contacts ?
J'avais pas fait attention mais que cherche tu a faire :
->setparameter("circo", $criteria['circo']->getCirco())
peut-tu mettre se que tu obtiens dans ton dd($criteria);