CakePHP在连接表上找到

时间:2012-11-23 12:23:21

标签: cakephp

很抱歉,如果这是显而易见的 - 我正在尝试在连接表上执行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(),我会收到错误。

我哪里错了?提前谢谢。

2 个答案:

答案 0 :(得分:2)

不幸的是,如果没有一些额外的工作,就无法在其中一个父模型上对HABTM连接表执行此类查询。我假设Expense是父模型而ExpensesCode是连接模型?

常见的方法是对HABTM连接表进行建模。假设您有一个由expenses加入的codesexpenses_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关联关联的三个模型的简写。

我发现这是保存和检索数据的最简单方法之一。

了解更多信息: http://book.cakephp.org/2.0/en/models/saving-your-data.html#what-to-do-when-habtm-becomes-complicated