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 :(

10 réponses


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

Merci pr ta répone, comment resoudre le problème alors?

Il te manque pas au depart :

 $qb = $this->createQueryBuilder('u')

oui dans le code que j'ai collé ici il n'ya pas, mais chez moi si,

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 :

  • seul le premier critère circo est obligatoire (zone géographique) ... mais ce n'est pas obligatoire. Moi ça a été mon choix.
  • tous les autres critères sont optionnels, c'est à dire que tu peux chercher par nom et/ou par critère (un ou plusieurs)
  • par exemple recherche par nom, ou recherche (sans nom) sur un ou plusieurs critères grâce à chaque if.
  • il faut utiliser "andwhere" sinon un "where" écrase le reste de ta requête.
  • quand tu transmets les infos à la vue, dans la vue tu fais une boucle en twig ... {% for contact in contacts %} et tu affiches tes résultats ligne par ligne (c'est du classique)
  • j'ai mis un compteur pour avoir le total des recherches trouvées
            <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

merci et meilleur à toi.