很抱歉,如果这是显而易见的 - 我正在尝试在连接表上执行find()并且失败,是否有正确的语法来执行此操作?
基本上我有一个带有费用表的HABTM关联的expenseCode表。
在我的开销代码模型中,我有:
public function beforeDelete($cascade = false) {
$count = $this->Expense->find("count", array(
'conditions' => array('expense_code_id' => $this->id)
));
if ($count == 0) {
return true;
} else {
//$this->Session->setFlash('Record cannot be deleted as it has ' . $count . 'number of expenses attached to it');
return false;
}
}
如果我取消注释setFlash(),我会收到错误。
我哪里错了?提前谢谢。
答案 0 :(得分:2)
不幸的是,如果没有一些额外的工作,就无法在其中一个父模型上对HABTM连接表执行此类查询。我假设Expense是父模型而ExpensesCode是连接模型?
常见的方法是对HABTM连接表进行建模。假设您有一个由expenses
加入的codes
和expenses_codes
表:
$this->Expense->bindModel(array('hasOne' => array('ExpensesCode')));
$this->Expense->find('all', array(
'fields' => array('Expense.*'),
'conditions' => array('ExpensesCode.expense_code_id' => $this->id)
));
但是,当定义HABTM关联时,Cake还会自动为连接表建立模型(请参阅the manual,并在可能的键列表中使用“键”“)
所以这个语法可以让你直接查询连接表:
$this->Expense->ExpensesCode->find('all', array(
'conditions' => array('ExpensesCode.expense_code_id' => $this->id)
));
上面的查询将为您提供一个仅包含连接表结果的数组,因为它不像第一个过程那样执行连接。因此,您必须在费用模型上执行第二次find()
,以便从ExpensesCode中查找与expense_code_id
相关的费用。
修改强>
这是一个框架约定,HABTM连接表应该被强调并按字母顺序排列。因此,如果HABTM联接表被称为codes_expenses
,则会将其自动建模为CodesExpense
。
答案 1 :(得分:0)
如果您创建另一个具有两个hasMany关系的模型而不是一个具有HABTM的模型,您也可以以更简单的方式工作。
两个模型之间的HasAndBelongsToMany实际上是通过hasMany和belongsTo关联关联的三个模型的简写。
我发现这是保存和检索数据的最简单方法之一。