0

これが明らかな場合は申し訳ありません-結合テーブルでfind()を実行しようとして失敗しましたが、これを実行するための正しい構文は何ですか?

基本的に、私は経費テーブルとのHABTM関係を持つexpenseCodeテーブルを持っています。

私の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()のコメントを外すと、エラーが発生します。

どこが間違っているのですか?前もって感謝します。

4

2 に答える 2

2

残念ながら、追加の作業なしに、親モデルの1つから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)
));

ただし、Cakeは、HABTMアソシエーションが定義されている場合、結合テーブルのモデルも自動初期化します(マニュアル、および可能なキーのリストの「with」キーを参照してください)。

したがって、この構文を使用すると、結合テーブルを直接クエリできます。

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

上記のクエリは、最初の手順のように結合を実行しないため、結合テーブルの結果のみを含む配列を取得します。したがって、 from ExpensesCodefind()に関連する経費を見つけるには、経費モデルで1秒実行する必要があります。expense_code_id

編集: HABTM結合テーブルに下線を付け、アルファベット順に並べるのはフレームワークの規則です。したがって、HABTM結合テーブルが呼び出されるとcodes_expenses、として自動モデル化されCodesExpenseます。

于 2012-11-23T13:05:53.867 に答える
0

HABTMではなく2つのhasManyリレーションを持つ別のモデルを作成する場合も、より簡単な方法で作業できます。

2つのモデル間のHasAndBelongsToManyは、実際には、hasManyとbelongsToの両方の関連付けを介して関連付けられた3つのモデルの省略形です。

これは、データを保存および取得するための最も簡単な方法の1つであることがわかりました。

詳細については、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 に答える