0

抱歉,如果这很明显 - 我正在尝试在连接表上执行 find() 并且失败了,这样做的正确语法是什么?

基本上,我的费用代码表与费用表有 HABTM 关系。

在我的费用代码模型中,我有:

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() 我得到错误。

我哪里错了?提前致谢。

4

2 回答 2

2

不幸的是,如果没有一些额外的工作,就不可能从其中一个父模型对 HABTM 连接表执行这样的查询。我假设 Expense 是父模型,而 ExpensesCode 是连接模型?

一种常见的方法是对 HABTM 连接表进行建模。假设您有一个expensesandcodes表,由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 也会自动初始化连接表的模型(参见手册,以及可能键列表中的“with”键)。

所以这个语法可以让你直接查询连接表:

$this->Expense->ExpensesCode->find('all', array(
  'conditions' => array('ExpensesCode.expense_code_id' => $this->id)
));

上面的查询将为您提供一个仅包含连接表结果的数组,因为它不像第一个过程那样执行连接。因此,您必须find()在 Expense 模型上执行第二次才能找到与expense_code_idfrom ExpensesCode 相关的费用。

编辑: 这是一个框架约定,HABTM 连接表应该加下划线并按字母顺序排列。因此,如果调用codes_expensesHABTM 连接表,它会自动建模为CodesExpense

于 2012-11-23T13:05:53.867 回答
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

于 2012-11-23T13:23:01.440 回答