Bonjour,
J'ai une barre de recherche et quand je tape par exemple "maxime".
cela me retourne bien tout les Noms ou Prénoms qui contiennent le mot "maxime".

Voici la requête de ma fonction recherche :

$Findpersonnes = $this->Personne->find('all', array('conditions' => 
array( 'OR' => 
    array('Personne.per_nom LIKE' => '%'.$motcle.'%' , 'Personne.per_prenom LIKE' => '%'.$motcle.'%'))));

cette opération est possible grâce au LIKE .
mais imaginons que je tape "maxime michel".
j'aimerais que cela me retourne tout les noms en "michel" ou "maxime", les prénoms également en "michel" "maxime"

J'ai exploré la piste du REGEXP ou du IN... mais je n'est pas trouvé.

si vous avez des Pistes à m'indiquer je suis preneur. :)

3 réponses


BenFarhat
Réponse acceptée

Si je peut me permettre de proposer deux pistes:)
1-----------------------------------
tu peux récupérer tes données et en faire un tableau que tu passe à ta requête
Dans ta vue

echo $this->Form->input('termes',array('label' => false,'class'=>'search-query','type'=>'texte','placeholder'=>'Personne à rechercher','autocomplete'=>'off','escape'=>false ));

Dans ton controller

if(isset($this->request->query'data']'termes']))
{
$recherche = $this->request->query'data']'termes'];
}
$recherche = Sanitize::html($recherche, array('remove' => true));
$recherche = trim($recherche);
$recherche = explode(' ',$recherche);
$mots=array();
foreach($recherche as $mot)
{
$mots]='%'.$mot.'%';
}

et après je présume que tu peux faire

$Findpersonnes = $this->Personne->find('all', array('conditions' =>
array( 'OR' =>
    array('Personne.per_nom LIKE' => $mots , 'Personne.per_prenom LIKE' => $mots))));

Bien sur c'est l'idée (sur papier si on peut dire) donc faut tester,

2-----------------------------------
sinon tu peux également sur la même base créer ta requête en bouclant sur les mots écrit et les champs ou tu veux rechercher cs mots

$recherche = Sanitize::html($recherche, array('remove' => true));
$recherche = trim($recherche);
$mots = explode(' ',$recherche);
$req='';
$champs=array('Personne.name','Personne.nom','Personne.identifiant','Personne.services','Personne.blablabla','Personne.tel','Personne.observation'); /// la tu met tes champs à toi
// ensuite on construit notre requête
foreach($mots as $mot) // pour chaque mot
{
    foreach($champs as $champ) // pour chaque champ
    {       
        $req .= $champ.' LIKE "%'.$mot.'%" OR ';
    }

}
$req .= ' 1=0'; // ca c'est pour la dernière virgule de la boucle et vu que c'est un OR c'est une condition bidon

ensuite tu fais

$this->set('title_for_layout','Résultat de la recherche');
$this->Personne->recursive = 0;
$this->paginate = array(
    'conditions' => array(
                      'OR' => array($req
                      )
                      ),
    'order' => 'Personne.id ASC'
);
$this->set('personnes', $this->paginate());

Puis dans ta vue tu mets un petit debug($personnes); pour voir ce que cela donne

Voila, J'espère que cela répond a tes besoins :)

Merci pour cette réponse pointue .
j'ai appliqué la 2ème piste que tu m'a donnée à mon code . Je pense que je suis vraiment pas loin d'avoir bon mais j'ai encore un petit soucis, car j'envoie le mot clé du formulaire de recherche à ma fonction recherche() de mon Controller Dossiers. seulement, dans cette fonction je fais une recherche (find all) à la fois dans ma table Dossier ( normal car je suis dans mon Controller Dossier) mais également dans ma table Personne
et quand j'effectue ma recherche en appliquant cela :

$champs=array('Personne.per_nom','Personne.per_prenom') //colonnes utiles à ma recherche de ma table Personne.

cela m'affiche un message d'erreur :

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Personne.per_nom' in 'where clause'

SQL Query: SELECT Dossier.id, Dossier.DOS\_AnneeArchiv, Dossier.localisation\_id, Dossier.DOS\_Code1, Dossier.DOS\_Code2, Dossier.DOS\_Code3, Dossier.DOS\_Code4, Dossier.DOS\_Code5, Dossier.DOS\_Code6, Dossier.DOS\_Code7, Dossier.DOS\_Code8, Dossier.DOS\_Code9, Dossier.DOS\_Code10, Localisation.id, Localisation.LOC\_AdrPhysique FROM archtiase.dossiers AS Dossier LEFT JOIN archtiase.localisations AS Localisation ON (Dossier.localisation\_id = Localisation.id) WHERE Personne.per\_nom LIKE "%MAXIME%" OR Personne.per\_prenom LIKE "%MAXIME%" OR 1=0 ORDER BY Personne.id ASC LIMIT 20

Cela veut dire qu'il me fait la recherche dans ma table dossier et non dans ma table personne.

Comment faire pour lui préciser de faire la recherche dans la table personne ? y compris pour la pagination ...

Voici le code lié à ce message d'erreur

class DossiersController extends AppController {
    public $uses = array('Dossier', 'Personne', 'Localisation' );
    public function recherche() {
        //récupération du mot clé
        $motcle0 = $this->data'Dossier']'motcle'];
        //changement du mot clé en Majuscule
        $motcle0 = strtoupper($motcle0);
        //recherche des dossiers en fonction de la conrrespondance entre l'id et le mot clé
        $dossiers = $this->Dossier->findById($motcle0);
        //recherche des personnes en fonction de la correspondance entre le nom ou le prenom et le motcle
        $mots = explode(' ',$motcle0);
        $Findpersonnes='';
        $champs=array('Personne.per_nom','Personne.per_prenom'); //colonnes utiles à ma recherche de ma table Personne.
        // ensuite on construit notre requête
        foreach($mots as $mot) // pour chaque mot
        {
            foreach($champs as $champ) // pour chaque champ
            {      
                $Findpersonnes .= $champ.' LIKE "%'.$mot.'%" OR ';
            }
        }
        $Findpersonnes .= ' 1=0';               
        //si il y a une réponse dans $dossiers , alors affiche la vue du dossier
        if(!empty($dossiers)){
            $this->Session->setFlash("Résultat pour '".$motcle0."'", 'default', array('class'=>'success'));
            return $this->redirect('/dossiers/view/'.$motcle0) ;
        }
        //sinon si il y a une réponse dans $Findpersonnes, 
        //alors ça en envoi Findpersonne à la page dossiers/recherche.ctp
        elseif(!empty($Findpersonnes)){
            $this->Personne->recursive = 0;
            $this->paginate = array(
                'conditions' => array(
                    'OR' => array($Findpersonnes
                        )
                    ),
                'order' => 'Personne.id ASC');
            $this->Session->setFlash("Résultat pour '".$motcle0."'", 'default', array('class'=>'success'));
                $this->set('Findpersonnes', $this->paginate());

        }
        //sinon, affichage d'un message d'érreur en restant sur la page actuelle
        else{
            $this->Session->setFlash(__("Aucun résultat pour '".$motcle0."'"));
            return $this->redirect($this->referer());
        }

    }

Bonjour, j'ai trouvé la solution à mon problème pour la recherche dans la table personne

$this->Personne->recursive = 0;
            $this->paginate = array(
            'Personne'=> array(
                'conditions' => array($Findpersonnes
                    ),
                'order' => 'Personne.id ASC'
                ),

            'table'=>'personnes');
            $this->Session->setFlash("Résultat pour '".$motcle0."'", 'default', array('class'=>'success'));
                $this->set('Findpersonnes', $this->paginate('Personne'));

Mais j'ai toujours un problème de pagination qui est abordé ici. Je valide la réponse de BenFarhat ( la piste N°2) qui m'a beaucoup aidé ;) .