Bonjour à tous,

je suis encore des les choux avec Paginate et les liasons.

J'ai un controller : SearchesController et une action : index.

J'ai aussi un champ de recherche qui va faire appeler au controller SearchesController pour que le critere de recherche soit rechercher dans la table Articles, comme ceci:

<?php
class SearchesController extends AppController{

    function index(){
        $data = current($this->request->data);

        if($this->request->is('put') || $this->request->is('post') ){

            $search_terms = explode(' ', $data'key']);
            $search_terms = array_diff($search_terms,array(''));
            $this->Session->write('Search.terms',$search_terms);
        }
        $conditions = array();
        foreach($this->Session->read('Search.terms') as $search_term){
            $conditions] = array('Article.name Like' =>'%'.$search_term.'%');
            $conditions] = array('Article.content Like' =>'%'.$search_term.'%');
            $conditions] = array('Article.noarticle Like' =>'%'.$search_term.'%');
        }

        $this->loadModel('Article');
                //$this->loadModel('Article','Page'); // Ne fonctionne pas
        $this->Article->contain('Tag');
        $this->paginate = array('Article'=>array('limit'=>12,'order'=>'name ASC'));
        $d'search'] = $this->Paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()','or' => $conditions));
                #debug($d);
        $this->set($d);
    }
}

Le problème que j'ai c'est que je souhaiterais qu'il fasse aussi la recherche dans la table Page et je ne sais pas comment modifier mon code pour cela. Page et Article ne sont pas liée. C'est juste quej'ai besoin de chercher un critère de recherche dans les deux tables

J'ai regardé s'il y a avit une combinaison avec loadModel('Article') ou l'on peut informer deux modèles, mais apparemment pas,.

Pourriez-vous m'aider à se sujet?

Je vous remercie

3 réponses


Bonjour.
Si les deux modèles ne sont pas liés, à moins de le faire en deux requêtes séparées, je ne vois pas comment tu pourrais faire.
Tu devras donc faire ta recherche en deux temps dans ton controller.
En premier lieu une recherche de tes termes de recherche dans ta table d'articles et en second lieu dans ta table de pages.
Et donc de faire avec deux loadModel.

Ha ok, c'est comme ceci que j'avais fait initialement. Mais es-ce que le paginator va addition les recherches?
Voici ce que je souhaitais faire (je ne sais pas si j'ai laissé des erreurs, je viens vite de le faire)
Le questionnement que je me pose surtout, c'est es-ce que le paginateur va compter et additionner les rechers de Page et Article?

<?php
class SearchesController extends AppController{

    function index(){
        $data = current($this->request->data);

        if($this->request->is('put') || $this->request->is('post') ){

            $search_terms = explode(' ', $data'key']);
            $search_terms = array_diff($search_terms,array(''));
            $this->Session->write('Search.terms',$search_terms);
        }

         /**
        * Search in Page
        **/
        $conditions = array();
        foreach($this->Session->read('Search.terms') as $search_term){
            $conditions] = array('Page.name Like' =>'%'.$search_term.'%');
            $conditions] = array('Page.content Like' =>'%'.$search_term.'%');
        }
        $this->loadModel('Page');
        $this->Article->contain('Tag');
        $this->paginate = array('Page'=>array('limit'=>12,'order'=>'name ASC'));
        $d'pages'] = $this->Paginate('Page',array('type'=>'page','online'=>1,'created <= NOW()','or' => $conditions));
        /**
        * Search in Article
        **/
        $conditions = array();
        foreach($this->Session->read('Search.terms') as $search_term){
            $conditions] = array('Article.name Like' =>'%'.$search_term.'%');
            $conditions] = array('Article.content Like' =>'%'.$search_term.'%');
            $conditions] = array('Article.noarticle Like' =>'%'.$search_term.'%');
        }
        $this->loadModel('Article');
        $this->Article->contain('Tag');
        $this->paginate = array('Article'=>array('limit'=>12,'order'=>'name ASC'));
        $d'articles'] = $this->Paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()','or' => $conditions));
                #debug($d);
        $d'search'] = array_merge($d'pages'],$d'articles']);    
        $this->set($d);
    }
}

Milles mercis

Je ne peux pas te le confirmer, mais j'en doute, à moins de paramétrer la pagination dans la vue concernée.
Je n'ai jamais fait de pagination pour des données de tables différentes non liées dans la même vue.

Je t'ai un peu modifier ton code, pour t'éviter les répétions inutiles, surtout celles pour le model Tag que tu liais au model Page, alors qu'à priori les deux modèles ne sont pas liés

<?php App::uses('AppController', 'Controller');
class SearchesController extends AppController{
/**
* Paramétrage des paginations
**/
    public $paginate = array(
        'Article' =>    array('limit' => 12, 'order' => 'Article.name ASC', 'contain' => 'Tag'),
        'Page' =>   array('limit' => 12, 'order' => 'Page.name ASC'));
    public function index(){
        $data = current($this->request->data);

        if($this->request->is('put') || $this->request->is('post') ){ 
            $search_terms = explode(' ', $data'key']);
            $search_terms = array_diff($search_terms,array(''));
            $this->Session->write('Search.terms',$search_terms);
        }

         /**
        * Search in Page
        **/
        $conditions = array();
        foreach($this->Session->read('Search.terms') as $search_term){
            $conditions] = array('Page.name Like' =>'%'.$search_term.'%');
            $conditions] = array('Page.content Like' =>'%'.$search_term.'%');
        }

        $this->loadModel('Page');
        $d'pages'] = $this->Paginator->paginate('Page',array('type'=>'page','online'=>1,'created <= NOW()','or' => $conditions));

        /**
        * Search in Article
        **/
        $conditions = array();
        foreach($this->Session->read('Search.terms') as $search_term){
            $conditions] = array('Article.name Like' =>'%'.$search_term.'%');
            $conditions] = array('Article.content Like' =>'%'.$search_term.'%');
            $conditions] = array('Article.noarticle Like' =>'%'.$search_term.'%');
        }

        $this->loadModel('Article');
        $d'articles'] = $this->Paginator->paginate('Article',array('type'=>'article','online'=>1,'created <= NOW()','or' => $conditions));
                // debug($d);

        $d'search'] = array_merge($d'pages'],$d'articles']); 
        $this->set($d); 
    }
}