2012-11-23 37 views
0

对不起,如果这是显而易见的 - 我试图做一个连接表上的find()和失败,什么是正确的语法来做到这一点?CakePHP在连接表上查找

基本上我有费用表与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

所以应该有不匹配expense_code_ids这 - > ID? 语法看起来正确,并且查找正在工作,但至少发现一个结果 – Quinny

回答

1

不幸的是,无法在一个父模型的HABTM连接表上执行这样的查询,而无需额外的工作。我假设费用是父模型和费用代码连接模型?

一种常见的方法是模拟HABTM连接表。假设你有哪些被expenses_codes加入了expensescodes表:

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

然而,蛋糕也自动iniatlises的连接表中定义的HABTM关联时(见the manual的模型,以及“与”可能的密钥列表中的键)。

所以这个语法将让你直接查询联接表:

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

上面的查询将净你只含有从连接表结果的阵列,因为它不执行加入像第一个程序。因此,您必须在费用模型上执行第二个find()以从费用代码中找到与expense_code_id相关的费用。

编辑: 这是一个框架公约,HABTM连接表应该强调并按字母顺序排列。因此,如果HABTM连接表被称为codes_expenses,则其自动建模为CodesExpense

+0

非常感谢答案,现在将对其进行测试。 –

+0

刚刚意识到HABTM表的惯例是按字母顺序排列。因此,如果您的连接表被称为'codes_expenses'并且由CakePHP自动建模为CodesExpense。 – mensch

+0

嗨,我的表名是 - 费用,费用代码和费用_数据_编码(连接表)。我想要这个检查进入Expense_code模型(所以如果你想用费用来删除费用代码,你会得到一个错误)。所以我猜我查找的查询将是 - $ this-> ExpenseCode-> Expense-> find ...?再次感谢 –