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 的 Controller 中的所有内容

$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 中应用“包含”,但仍然出现错误

4

1 回答 1

2

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

如果你真的想保留你的虚拟字段,你不应该使用可包含的,而是使用手动连接设置查询。

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

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