Bonjour à tous,

Je dois faire un recherche des mes champs content et name.
Ce code fonctionne avec un mot

$search = $this->request->data'Search']'key'];
$this->loadModel('Page');
        $d'pages'] = $this->Page->find('all', array(
            'conditions' => array(
                'online'=>'1',
                'type'=>'page',
                'created <= NOW()',
                'id > 1',
                'OR' => array(
                    'Page.name LIKE'=>'%'.$search.'%',
                    'Page.content LIKE'=>'%'.$search.'%'
                    )
                ),
            'fields'=> array('name','content','created','id','type')
        ));

Si dans la variabel $search, il y a le mot "web", il va me retourner toutes les enregistrements contenant ce mot.

Mais si je mets "web design" ou "web internet" ou web travail dormir"

Il me retiurne rien du tout.

Je n'ai aucune idée comment faire qu'il considere comme deux critère de recherche

Avez vous une idée

3 réponses


Je pense que le like foire si tu as un espace entre chaque mots.
Du coup il faudrait sur ton $search fasse un explode et un like par mot.

$search = $this->request->data'Search']'key'];
$searchTerms = explode(' ', $search);
$searchTermBits = array();
foreach ($searchTerms as $term) {
    $term = trim($term);
    if (!empty($term)) {
        $searchTermBits] = "Page.name LIKE '%$term%'";
    }
}
$this->loadModel('Page');
    $d'pages'] = $this->Page->find('all', array(
        'conditions' => array(
            'online'=>'1',
            'type'=>'page',
            'created <= NOW()',
            'id > 1',
            'OR' => array(
                 implode(' AND ', $searchTermBits),
                'Page.content LIKE'=>'%'.$search.'%'
               )
           ),
       'fields'=> array('name','content','created','id','type')
    ));

Ta requête ressemblera à quelque chose comme ça à la fin :
....Page.name LIKE '%web%' AND Page.name LIKE '%travail%' AND Page.name LIKE '%dormir%'....

Je ne suis pas du tout sur de ce que je t'apporte là, ne m'en veux pas si ça ne fonctionne pas :D

Super merci, y a de l'idée, je vais me pencher dessus dans un moment

Voici une idée :

Je vais travailler le $search avec str_word_count

$tab=str_word_count($search);

ce qui me donnera un tableau contenant tous mes mots.

Array
(
    [0] => mot1
    [1] => mot2
    [2] => mot3

)

Je n'ai plus qu'a faire une boucle sur ce tableau pour créer mes conditions. Je verrais bien une checkbox pour demander a l utilisateur s'il préfère un match query ou un match word.

++