2016-05-30 2 views
1

Meine Anforderung ist es, auf 2 verschiedene Tabellen zu suchen: Tierärzte und Kliniken. Es könnte eine Beziehung zwischen ihnen geben, d. H. Ergebnis sollte Kliniken haben 'a' im Namen und Tierärzte haben 'a' in ihnen. Tierärzte könnten mit Kliniken verwandt sein oder nicht. Momentan mache ich folgendes. Gibt es eine Methode, um 2 Abfragen zu vermeiden, die mir auch helfen können, den Cachephp Paginierungshelfer zu benutzen?Single Pagination auf mehreren Modellen in CakePHP

$this->paginate = array(
     'Vet' => array(
      'conditions' => $conditions, 
      'fields' => array('Vet.id', 'Vet.name', 'Vet.professionnal_address', 'phone_number', 'Vet.email', 'Vet.type', 'Vet.latitude', 'Vet.longitude','Vet.city','Vet.clinic_id','Vet.zipcode'), 
      'joins' => array( 
       array(
        'table' => 'vet_appointment_types', 
        'alias' => 'VetAppointmentType', 
        'type' => 'LEFT', 
        'conditions' => array(
         'Vet.id = VetAppointmentType.vet_id', 
        ) 
       ) 
      ), 
      'limit' => $limit, 
      'group' => array(
       'Vet.id' 
      ), 
      'order' => array(
       'Vet.name' => 'ASC' 
      ) 
     ), 
     'Clinic' => array(
      'conditions' => $conditions1, 
      'fields' => array('Clinic.*'), 
      'limit' => $limit, 
      'order' => array(
       'Clinic.name' => 'ASC' 
      ) 
     ) 
    ); 

$results = $this->paginate('Vet'); 
$results2 = $this->paginate('Clinic'); 

Ich habe versucht, durch die Standard-Paginierung Komponente in einem nicht Datenbank-Modell erstreckt und Vereinigung mit, aber die Datenbankstruktur in einem wenig komplex so nicht Union nutzen kann. Außerdem denke ich, dass die Implementierung eines temporären tabellenbasierten Modells eine Option wäre, aber da es für die Suche verwendet wird, wie genau es umgesetzt werden soll, kann ich nicht denken. Jede Hilfe wäre + 1'd;)

+1

Wenn Sie Union oder eine Ansicht nicht verwenden können, haben Sie eine harte Zeit, nicht zugeordnete Daten aus zwei Tabellen zu paginieren. Ich würde zu diesem Zweck einen Suchindex mit Elastic Search implementieren. – burzum

+0

Wenn ich eine temporäre Tabelle verwenden würde, um Daten von beiden Tabellen zu speichern und dann zu suchen, wäre das eine mühsame Methode? – Sp0T

+0

Es würde, und wenn sich Daten ändern, müssten Sie die temporäre Tabelle ändern. Vielleicht solltest du in eine Datenbankansicht schauen? – MBosman

Antwort

0

Wie vorgeschlagen, habe ich es mithilfe von Datenbankansichten erreicht. Unten ist der Code. Alle Verbesserungsvorschläge werden sehr geschätzt.

// \app\Model\Search.php 
App::uses('ConnectionManager', 'Model'); 
App::uses('AppModel', 'Model'); 
App::uses('CakeLog', 'Log'); 

class Search extends AppModel { 

    public function __construct() { 
     parent::__construct(); 

     $connection = ConnectionManager::getDataSource('default'); 
     $return = $connection->execute("CREATE OR REPLACE VIEW `search` AS 
      SELECT Vet.id, (CONCAT(`Vet`.`fname` , ' ', `Vet`.`lname`)) AS name, 'vet' AS TYPE , Vet.latitude, Vet.longitude, Vet.zipcode, Vet.speciality FROM `db`.`vets` AS `Vet` 
      UNION 
      SELECT Clinic.id, Clinic.name, 'clinic' AS TYPE , Clinic.lat, Clinic.long, Clinic.zipcode, Clinic.address FROM `db`.`clinics` AS `Clinic`"); 
     $return = ($return == true)?'Search View created successfully on '.date('Y-m-d H:i:s'):$return; 
     CakeLog::write('search', $return); 
    } 

    public $useTable = 'search';// This model does not use a database table 
    public $primaryKey = 'id'; // Define primary key 
    public $useDbConfig = 'default'; // Define db 

} 

Dies ist der model.Everytime Benutzer etwas sucht, wenn das Modell in der Steuerung geladen wird, wird Ansicht erstellt/ersetzt, so dass aktualisierte Werte abgerufen werden können. Es kann wie jedes andere Modell in CakePHP verwendet werden. Es unterstützt auch virtuelle Felder. Um Ihre Abfrage für die Datenbankansicht zu erstellen, können Sie auch den Abfrage-Generator verwenden, den ich wie folgt verwendet habe.