2013-07-03 34 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