2013-07-03 103 views
2

我在CakePHP的新手和我有一個問題:虛擬域和模型別名

型號:CostsCenter-> Scholarship-> ScholarshipsDetail

1.獎學金型號虛擬現場:

public $virtualFields = array(
    'code' => "UPPER(CONCAT(SUBSTR(CostsCenter.name, 1, 3), '-', 
    Scholarship.selection_year, '-', SUBSTR(Country.name, 1, 3), '-', 
    Postulant.number))"); 

2.列出所有從ScholarshipsDetail

控制器0
$scholarships_detail = $this->ScholarshipsDetail->find('all', 
      array('contain' => array('Scholarship' => array('CostsCenter')), 
       'conditions' => array('ScholarshipsDetail.scholarship_id' => $scholarship_id))); 

然後,我需要列出ScholarshipsDetail,但我有錯誤:

Column not found: 1054 Unknown column 'CostsCenter.name' in 'field list' 

我試圖申請「包含」在CostsCenter跨越獎學金,但依然出現

回答

2

的問題是使用容器進行查找不會選擇ScholarshipDetail JOIN Scholarship JOIN CostCenter。 如果您查看SQL調試輸出,您將看到首先獲得了ScholarshipDetail和Scholarship記錄,然後循環執行這些記錄,並通過在CostCenter表上進行單獨選擇將CostCenter記錄添加到結果數組中。 因此,CostCenter字段不可用於虛擬字段,查詢失敗。 This link有助於更好地解釋這個可容納的陷阱。

如果你真的想保留你的虛擬領域,你不應該使用包含和設置查詢使用manual joins而不是

但是,由於您將經常遇到此類問題,因爲您的虛擬領域引用了不同的模型,因此創建一個實際字段將會更好,而不是。嘗試是這樣的:

  • 創建一個名爲在獎學金錶
  • 創建的功能,例如updateCode()在通過選擇各種表格正確的信息制定出碼獎學金模型,然後代碼字段更新代碼獎學金錶中的字段。
  • 從任何動作後,控制器此功能可能影響的代碼,例如,當一個獎學金記錄被編輯(或考慮把它在獎學金模型afterSave callback