Décrivez ici votre problème ou ce que vous cherchez à faire.
Entourez votre code en utilisant "```" pour bien le mettre en forme. (ne copiez pas trop de code)
""
public function getUsersFilters($sex, $naissancedebut,$naissancefin,$marelation,$tabac,$enfant,$langue,$religion,$alcool,$ville,$etude,$enline,$id,$pays,$latitude,$longitude,$requestedDistance)
{
$qb->select('u.id, u.username,u.profile,u.ville,u.isPhoto,u.isSocialPhoto,u.naissance,u.lastActivateDate,u.userToken,u.email,u.pays,u.codePays,u.isPayement,u.typePayement,u.expirationPayement,u.emploi,u.niveauEtude,u.typeRelation,u.maRelation,u.longitude,u.latitude,u.taille,u.enfant,u.tabac,u.ecole,u.telephone,u.alcool,u.religion,u.langue,u.description,u.sexe,u.isoCode,u.cubeId,u.cubeEmail,u.cubeFullname,u.cubeLogin,u.createdAt, u.actif');
if (isset($etude) && $etude !=null) {
$qb->andWhere('u.niveauEtude = :etude')
->setParameter('etude', $etude);
}
if (isset($enline) && $enline !=null) {
$date5mins = new \DateTime('7 minutes ago');
$qb->andWhere('u.lastActivateDate <= :line')
->setParameter('line',$date5mins);
}
if (isset($naissancedebut) && $naissancedebut !=null) {
$qb->andWhere('u.naissance BETWEEN :naissancedebut AND :naissancefin')
->setParameter('naissancedebut', $naissancedebut)
->setParameter('naissancefin', $naissancefin);
}
if (isset($marelation) && $marelation !=null) {
$qb->andWhere('u.maRelation = :marelation')
->setParameter('marelation', $marelation);
}
if (isset($tabac) && $tabac !=null) {
$qb->andWhere('u.tabac = :tabac')
->setParameter('tabac', $tabac);
}
if (isset($enfant) && $enfant !=null) {
$qb->andWhere('u.enfant = :enfant')
->setParameter('enfant', $enfant);
}
if (isset($langue) && $langue !=null) {
$qb->andWhere('u.langue IN(:langue)')
->setParameter('langue', $langue);
}
if (isset($alcool) && $alcool !=null) {
$qb->andWhere('u.alcool = :alcool')
->setParameter('alcool', $alcool);
}
if (isset($religion) && $religion !=null) {
$qb->andWhere('u.religion = :religion')
->setParameter('religion', $religion);
}
$qb->andWhere('u.pays =:pays')
->setParameter('pays', $pays);
$qb->andWhere('u.id !=:id')
->setParameter('id', $id)
->andWhere('u.actif =true');
$qb->andWhere('u.sexe !=:s')
->setParameter('s' ,$sex)
->having('distance <= :distance')
->setParameter('distance', $requestedDistance)
->orderBy('distance', 'ASC');
$query = $qb->getQuery();
$result = $query->getResult();
return $result;
}
""
Ce que je veux
Décrivez ce que vous cherchez à obtenir.
Ce que j'obtiens
Décrivez vos éventuelles erreurs ou ce que vous obtenez à la place de ce que vous attendez :(
Enfait je veux donner la possibilité aux utilisateurs de filtrer d'autres utilisateurs, donc certains paramètrers peuvent être null. ça me retourne aucun resultat à chaque fois alors que lorsque je regarde dans la Bd je vois que ça aurait dû me retouner les resultats
Bonjour ta function pourait-être simplifier déjà.
ça résoudera pas le problème mais ça sera déjà plus simple.
Pourquoi tu fais pas plutôt :
$options = [
'id' => '...',
'username' => '...',
'profile' => '...',
'ville' => '...',
'etude' => '...',
];
public function getUsersFilters(array $options){
extract($options);
if (isset( $etude)) {
$qb->andWhere('u.niveauEtude = :etude')
->setParameter('etude', $etude);
}
....
}
@Grafikart a mis une charte pour poster de jolie Topic essaye de respecter ;)
Bonjour,
J'ai eu le même problème que toi et j'ai cherché pendant ... des jours. Mais j'ai trouvé. C'était un problème de syntaxe.
C'est pour une Asso. Je sélectionne dans un formulaire un 1er critère "circo" et je rajoute des options supplémentaires (case à cocher).
Attention, il faut créer une entité spéciale qui ne soit pas mappée avec ton ORM (elle ne vise pas à MODIFIER ta BDD, seulement à l'interroger et récupérer des résultats).
Donc dans mon repository j'ai ce qui suit :
/**
* @return Contacts[] Returns an array of Contacts objects
*/
public function searchContact($criteria)
{
$query = $this->createQueryBuilder('c')
->select('c')
->andWhere('c.circo = :circo')
->setparameter('circo', $criteria->getCirco());
if ($criteria->cp) {
$query = $query
->andWhere('c.cp = :cp')
->setParameter('cp', $criteria->getCp());
}
if ($criteria->nom) {
$query = $query
->andWhere('c.nom = :nom')
->setParameter('nom', $criteria->getNom());
}
if ($criteria->sympat) {
$query = $query
->andWhere('c.sympat = :sympat')
->setParameter('sympat', $criteria->getSympat());
}
if ($criteria->adherent) {
$query = $query
->andWhere('c.adherent = :adherent')
->setParameter('adherent', $criteria->getAdherent());
}
if ($criteria->don) {
$query = $query
->andWhere('c.don = :don')
->setParameter('don', $criteria->getDon());
}
if ($criteria->colleur) {
$query = $query
->andWhere('c.colleur = :colleur')
->setParameter('colleur', $criteria->getColleur());
}
if ($criteria->tracteur) {
$query = $query
->andWhere('c.tracteur = :tracteur')
->setParameter('tracteur', $criteria->getTracteur());
}
if ($criteria->porte) {
$query = $query
->andWhere('c.porte = :porte')
->setParameter('porte', $criteria->getPorte());
}
if ($criteria->elu) {
$query = $query
->andWhere('c.elu = :elu')
->setParameter('elu', $criteria->getElu());
}
if ($criteria->voiture) {
$query = $query
->andWhere('c.voiture = :voiture')
->setParameter('voiture', $criteria->getVoiture());
}
return $query->getQuery()->getResult();
;
}
Et dans mon controller j'ai ça :
/**
* @Route("/contact/search", name="search")
*/
public function search(ContactsRepository $ContactsRepository, Request $request)
{
$search = new SearchContacts();
$searchform = $this->createForm(SearchContactType::class, $search)->handleRequest($request);
if($searchform->isSubmitted() && $searchform->isValid()) {
$criteria = $searchform->getData();
$search = $ContactsRepository->searchContact($criteria);
return $this->render('contact/contact2.html.twig', [
"contacts" => $search
]);
}
return $this->render('search/search.html.twig', [
'searchform' => $searchform->createView()
]);
}
Au final, il te faut créer une entité non mappée + un formulaire pour pouvoir sélectionner un ou plusieurs critères.
Pour le controller et le repo, le code est ci-dessus et ça marche parfaitement bien.
Te reste juste à l'adapter pour ton besoin.
Bon courage
En fait en relisant mon post je pense que tu vas galérer avec l'entité non mappée.
Donc j'ai une entité "Contacts" qui me sert pour mon CRUD (Ajouter, modifier, supprimer).
J'ai créé une autre entité "ContactsSerach" comme ci-dessous. Tu constateras qu'elle n'est pas liée à l'ORM. Normal ... c'est pour chercher.
La voici ... et là tu as tous sauf le formulaire de recherche (je te laisse le faire). Les case à cocher sont des booléens donc 1 ou 0 dans la BDD.
A toi de jouer ...
<?php
namespace App\Entity;
use Symfony\Component\Form\FormTypeInterface;
class SearchContacts
{
public $circo;
public $cp;
public $nom;
public $sympat;
public $adherent;
public $don;
public $colleur;
public $tracteur;
public $porte;
public $elu;
public $voiture;
public function getCirco(): ?int
{
return $this->circo;
}
public function setCirco(int $circo): self
{
$this->circo = $circo;
return $this;
}
public function getCp(): ?int
{
return $this->cp;
}
public function setCp(int $cp): self
{
$this->cp = $cp;
return $this;
}
public function getSympat(): ?bool
{
return $this->sympat;
}
public function setSympat(?bool $sympat): self
{
$this->sympat = $sympat;
return $this;
}
public function getAdherent(): ?bool
{
return $this->adherent;
}
public function setAdherent(?bool $adherent): self
{
$this->adherent = $adherent;
return $this;
}
public function getDon(): ?bool
{
return $this->don;
}
public function setDon(?bool $don): self
{
$this->don = $don;
return $this;
}
public function getTracteur(): ?bool
{
return $this->tracteur;
}
public function setTracteur(?bool $tracteur): self
{
$this->tracteur = $tracteur;
return $this;
}
public function getPorte(): ?bool
{
return $this->porte;
}
public function setPorte(?bool $porte): self
{
$this->porte = $porte;
return $this;
}
public function getElu(): ?bool
{
return $this->elu;
}
public function setElu(?bool $elu): self
{
$this->elu = $elu;
return $this;
}
public function getColleur(): ?bool
{
return $this->colleur;
}
public function setColleur(?bool $colleur): self
{
$this->colleur = $colleur;
return $this;
}
public function getVoiture(): ?bool
{
return $this->voiture;
}
public function setVoiture(?bool $voiture): self
{
$this->voiture = $voiture;
return $this;
}
public function __toString(): ?string {
return $this->circo;
}
/**
* Get the value of nom
*/
public function getNom()
{
return $this->nom;
}
}
Merci beaucoup Bernard, et désolé pour la réponse tardive, ça m'a beaucoup tapé que je me suis concentré à faire autre chose
De rien ... si ça t'a rendu service tant mieux.
Un dernier point sur le fonctionnement du formulaire de recherche :
<tbody>
{% set sum = 0 %}
{% for contact in contacts %}
{% set sum = sum + 1 %}
.....
</tbody>
</table>
<div style="color: red">
<h5>TOTAL : {{ sum }} </h5></div><br>
</div>
Voilà ... bonnes fêtes de fin d'année