2016-05-30 127 views
1

我的需求是在2個不同的表格上搜索:Vets和Clinics。他們之間可能存在關係,即結果應該是獲得名義上的'a'和獸醫中有'a'的獸醫。獸醫可能與診所有關,也可能不是。目前我正在做以下事情。是否有任何方法可以避免運行2個查詢,這也可以幫助我使用cakephp分頁助手?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'); 

我試圖在非數據庫模型擴展默認分頁成分並且有點複雜使用UNION但數據庫結構,所以不能用結合。另外,我認爲實現基於臨時表的模型將是一種選擇,但由於它將用於搜索,所以我無法想象如何實施它。任何幫助將被+1);

+1

如果您不能使用聯合或視圖,您將很難分頁來自兩個表的非關聯數據。爲此,我將使用彈性搜索實現搜索索引。 – burzum

+0

如果我要使用臨時表來存儲來自tabled和search的數據,它會是一個乏味的方法嗎? – Sp0T

+0

它會和任何數據更改時,你將不得不改變臨時表。也許你應該看看數據庫視圖? – MBosman

回答

0

根據建議,我通過使用數據庫視圖完成它。以下是代碼。任何改進建議,高度讚賞。

// \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 

} 

這是model.Everytime用戶搜索什麼,當模型在控制器被加載時,視圖創建/代替,使得更新的值可以取出。它可以用作cakephp中的任何其他模型。它也支持virtualFields。要爲數據庫視圖構建查詢,還可以使用我使用的查詢構建器,如下所示。

$joins = array(
     array(
      'table' => 'vet_appointment_types', 
      'alias' => 'VetAppointmentType', 
      'type' => 'LEFT', 
      'conditions' => array(
       'Vet.id = VetAppointmentType.vet_id', 
      ) 
     ) 
    ); 

    $dbo = $this->Vet->getDataSource(); 
    $subQuery = $dbo->buildStatement(
     array(
      'fields' => array('Vet.id', 'Vet.name'), 
      'table' => $dbo->fullTableName($this->Vet), 
      'alias' => 'Vet', 
      'limit' => $limit, 
      'group' => array(
       'Vet.id' 
      ), 
      'order' => array(
       'Vet.name' => 'ASC' 
      ), 
      'offset' => null, 
      'joins' => $joins, 
      'conditions' => $conditions 
     ), 
     $this->Vet 
    ); 
    $query = $subQuery; 

    $query .= ' UNION '; 

    $dbo = $this->Clinic->getDataSource(); 
    $subQuery = $dbo->buildStatement(
     array(
      'fields' => array('Clinic.id', 'Clinic.name'), 
      'table' => $dbo->fullTableName($this->Clinic), 
      'alias' => 'Clinic', 
      'limit' => $limit, 
      'conditions' => $conditions1, 
      'limit' => $limit, 
      'order' => array(
       'Clinic.name' => 'ASC' 
      ), 
      'offset' => null 
     ), 
     $this->Clinic 
    ); 

    $query .= $subQuery; 

    print_r($query);