2014-01-23 64 views
0

我想要獲取所有訪問者的列表,只包含最新的訪問信息和關聯的API調用的VisitType描述,我需要能夠在一個找。以前我們在下面有第二個代碼塊,但是當訪問者有多個關聯的訪問記錄(每個訪問記錄一個)時,這會返回訪客的多個記錄。我只需要得到最近的(MAX(Visit.visit_date),但是如果我們打算加入VisitType,顯然不能使用它),因爲它與VisitType.type_description相關聯。嘗試替換CakePHP模型綁定使用Containable不起作用

因爲我們試圖獲取訪客列表,所以beforeFind()函數在Visitor模型上。

我得到後續的問題,當我試圖使用下面的中容納代碼:

Warning (512): Model "Site" is not associated with model "Site" [CORE/Cake/Model/Behavior/ContainableBehavior.php, line 343] 

Warning (512): Model "SubjectStatus" is not associated with model "SubjectStatus" [CORE/Cake/Model/Behavior/ContainableBehavior.php, line 343] 

我有這些協會建立:

  • 遊客的hasMany人次,訪問hasOne遊客
  • 瀏覽人次擁有一個網站,一個網站有許多訪問者
  • VisitorStatus有很多訪客,參訪者屬於VisitorStatus
  • 訪問hasOne VisitKind,VisitKind的hasMany訪問

失敗中可容納代碼:

public function beforeFind($options, $primary=false) { 
    if ($this->__AjaxDataLoad) { 
     // Replacing a bunch of Model rebinds with Containable 

     $this->Behaviors->load('Containable'); 

     $this->contain(array(
     'Site' => array(
      'conditions' => array('Site.id = Visit.site_id'), 
      'field' => array('Site.site_name') 
     ), 
     ‘VisitorStatus' => array(
      'conditions' => array(‘VisitorStatus.id = Visitor.visit_status_id'), 
      'field' => array(‘VisitorStatus.status') 
     ), 
     'Visit' => array(
      'conditions' => array('Visit.subject_id = Visitor.id'), 
      'order' => 'Visit.visit_date DESC', 
      'limit' => 1, 
      'VisitType' => array(
      'conditions' => array('Visit.visit_type_id = VisitType.id'), 
      'fields' => array('VisitType.type_description'), 
     ) 
     ) 
    )); 
    } 
    } 

此前,後續碼「作品」與包括每個訪客多行,一行的不良副作用每次訪問:

public function beforeFind($options, $primary=false) { 
    if ($this->__AjaxDataLoad) { 
     $this->unbindModelAll(); 
     $this->bindModel(array(
     'belongsTo' => array(
      'Site' => array(
      'className' => 'Site', 
      'foreignKey' => 'site_id', 
     ), 
      ‘VisitorStatus' => array(
      'className' => ‘VisitorStatus', 
      'foreignKey' => ‘visitor_status_id', 
     ) 
     ), 
     'hasOne' => array(
      'Visit' => array(
      'className' => 'Visit', 
      'foreignKey' => ‘visitor_id', 
      'order' => 'Visit.visit_date DESC’, 
      ‘limit’ => 1 // <—————————————— THIS DOES NOTHING 
     ), 
      'VisitType => array(
      'foreignKey' => false, 
      'conditions' => array("Visit.visit_type_id = VisitType.id"), 
      'fields' => array('VisitType.type_description’) 
     ) 
     ) 
    )); 
    } 
    } 

我嘗試的Containable結構有什麼問題嗎?

我必須配置調試= 2,CakePHP的2.2.5版本

回答

0

我最終完全規避CakePHP的關係技術想出瞭解決辦法。這歸結爲使用virtualFields和子查詢作爲最後的手段。

public function beforeFind($options) { 
    if ($this->__AjaxDataLoad) { 
     $options['joins'] = array(
     array(
      'table' => 'visits', 
      'alias' => 'Visit', 
      'type' => 'LEFT', 
      'conditions' => array('Visit.visitor_id = Visitor.id') 
     ) 
    ); 
     $options['group'] = array('Visitor.id'); 
     if (is_null($options['fields'])) { 
     $options['fields'] = array(
      'Visitor.*', 'Site.*', 'VisitorStatus.*' 
     ); 
     } 
     $this->virtualFields['last_visit_date'] = 'MAX(Visit.visit_date)'; 
     $this->virtualFields['last_visit_kind'] = 'SELECT visit_kinds.kind FROM visits INNER JOIN visit_kinds ON visits.visit_kind_id = visit_kinds.id WHERE visits.visitor_id=Visitor.id ORDER BY visits.visit_date DESC LIMIT 1'; 
    } 
    return $options; 
    }