虚拟字段和模型别名

时间:2013-07-03 16:05:28

标签: cakephp cakephp-2.1 cakephp-appmodel

我是cakephp的新手,我有下一个问题:

型号:费用中心 - >奖学金 - >奖学金详情

1。奖学金模式中的虚拟领域:

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

2。在ScholarshipsDetail

中列出所有控制器
$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的奖学金中,但仍然出现错误

1 个答案:

答案 0 :(得分:2)

问题是使用可包含进行查找不会选择ScholarshipDetail JOIN Scholarship JOIN CostCenter。 如果查看SQL调试输出,您将看到首先获得ScholarshipDetail和Scholarship记录,然后循环遍历这些记录并通过在CostCenter表上进行单独选择将CostCenter记录添加到结果数组中。 因此,CostCenter字段无法在虚拟字段中使用,并且查询失败。 This link有助于更好地解释这个可容纳的陷阱。

如果您确实要保留虚拟字段,则不应使用可包含的内容并使用manual joins代替设置查询

但是,由于您的虚拟字段会引用不同的模型,因此您经常遇到此类问题,因此创建一个真实字段会更好。尝试这样的事情:

  • 在奖学金表中创建一个名为code的字段
  • 在奖学金模型中创建一个函数,例如updateCode(),通过从各个表中选择正确的信息来制定代码,然后更新奖学金表中的代码字段。
  • 在可能影响代码的任何操作后,从控制器调用此函数,例如编辑奖学金记录时(或考虑将其放入奖学金模型的afterSave callback