je cherche à créer une barre de recherche pour un projet permettant d'afficher des séries en fonction de leur nom ou de leur synopsis. Il faut donc une condition OR dans le WHERE que je n'arrive pas à reproduire... Le travail est tout simple en PHP, mais je bloque en Smfony 3. Autre conditions, il n'est pas nécessaire de taper tout les mots du nom ou synopsis de la série pour la trouver. Avec thrones n devrait trouver 'game of thrones' et avec chemistry on trouve 'breaking bad', mais la c'est aussi compliqué. Comment faire en sorte que ce soit reconnu comme ceci dans la requête ?
Voila la fonction que j'ai faite jusqu'ici:
/**
* @Route("/search", name="search")
* @Template()
*/
public function searchAction()
{
$em = $this->get('doctrine')->getManager();
$repo = $em->getRepository('AppBundle:TVShow');
$data = 'A high school chemistry teacher diagnosed with inoperable lung cancer turns to manufacturing and selling methamphetamine in order to secure his family\'s future.';
$shows = $repo->findBy(
array(
'name' => array('game of thrones', 'dexter', 'breaking bad'),
'synopsis' => array($data)
)
);
//erreur dans la reconnaissance de createQueryBuilder
/*$shows = $this->createQueryBuilder('s')
->where('s.name LIKE ?', '%'.$data.'%')
->orWhere('s.synopsis LIKE ?', '%'.$data.'%')
;*/
return $this->render('AppBundle:Default:shows.html.twig', array(
'shows' => $shows
));
}
comment faire pour récupérer le données d'un formulaire (formulaire sur la page twig et non par controller), séparer les mots pour chaque espace, et utiliser ces mots pour les comparer aux données présents dans la base ? Sachant que chaque mot peut n'être qu'une partie du résumé ou du titre d'une série.
Que l'action du formulaire envoi vers une action de ton controller: <form action="{{path('nom_route'}}" method="POST">
Dans le dis controller, tu regardes l'evenement du POST sur la variable request :
public function monAction(Request $request) {
if ($request->getMethod() == "POST")
Tu récupère les données avec ce même request, via les name de tes inputs dans ton twig :
// Soit tout récupérer dans un tableau :
$datas = $request->request->all(); // Array avec $datas['name_input'];
// Soit une par une :
$search = $request->request->get('name_input');
Ensuite tu parses cette variable par espace et tu l'envoi en requete :)
Voila, c'est deja un bon début
Voir une araignée c'est rien ... Le pire c'est quand tu ne la vois plus !
/**
* @Route("/search", name="search")
* @Template()
*/
public function searchAction(Request $request)
{
if ($request->getMethod() == "POST") {
$search = $request->request->get('search');
$em = $this->getDoctrine()->getManager();
$query_shows = $em->createQueryBuilder();
$query_shows
->select('s')
->from('AppBundle:TVShow', 's')
->where('s.name LIKE :data OR s.synopsis LIKE :data')
->setParameter('data', '%'.$search.'%');
$shows = $query_shows->getQuery()->getResult();
}
return $this->render('AppBundle:Default:shows.html.twig', array(
'shows' => $shows
));
}
Me reste plus qu'à empêcher d'afficher des résultats si je ne marque rien dans la barre, et à parser le code en ajoutant une petite boucle pour les 'LIKE' de la requête et ça devrait fonctionner. Quelque chose dans ce style:
$query_shows
->select('s')
->from('AppBundle:TVShow', 's');
for(data in datas){
$query_shows
->where('s.name LIKE :data OR s.synopsis LIKE :data')
->setParameter('data', '%'.data.'%');
}
str_split() est intéressante quoi que ne correspondant pas à mon besoin. Preg_split() et explode() semble pourvoir fonctionner et comme je n'ai pas besoin des options de preg_split-), je vais opter pour explode() que j'ai déjà eu l'occasion d'utiliser. Je ne pensais pas que ces fonctions PHP fonctionnaient dans le controller de Symfony 3.
Merci énormément pour ton aide, je pourrais tester ça ce soir en rentrant
Controller de symfony, c'est du PHP, tu peux utiliser toute fonction de PHP sans exception tu peux faire du mysqli() PDO(), DateTime, random() str_length... Après, utiliser du pdo alors qu'il y a doctrine c'est un peu bête mais pour le reste pas de limite, c'est du PHP Pur
Voir une araignée c'est rien ... Le pire c'est quand tu ne la vois plus !
J'ai fait ça mais seul le denier résultat est pris en compte Par exemple si je met "breaking throne", il renvoie "game of thrones"
$datas = explode(" ", $search);
$em = $this->getDoctrine()->getManager();
$query_shows = $em->createQueryBuilder();
$query_shows
->select('s')
->from('AppBundle:TVShow', 's');
foreach ($datas as $data) {
$query_shows
->where('s.name LIKE :data OR s.synopsis LIKE :data')
->setParameter('data', '%'.$data.'%');
}
</radiax>
[S3] Création d'une barre de recherche simple
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
</radiax>
</radiax>
</radiax>
</radiax>
</radiax>
</radiax>
</radiax>
</radiax>