1

CakePHPでのHABTMの関係に問題があります。

私はそのような2つのモデルを持っています:DepartmentHABTM Location。1つの大企業には多くの建物があり、各建物は限られた数のサービスを提供しています。各建物には独自のWebページもあるため、HABTMの関係自体に加えて、各HABTM行にはurl、ユーザーがアクセスして、関心のあるサービスとその建物での動作に関する追加情報を見つけることができるフィールドもあります。に興味がある。

私は次のようにモデルを設定しました:

<?php
class Location extends AppModel {
    var $name = 'Location';

    var $hasAndBelongsToMany = array(
        'Department' => array(
            'with' => 'DepartmentsLocation',
            'unique' => true
        )
    );
}
?>


<?php
class Department extends AppModel {
    var $name = 'Department';

    var $hasAndBelongsToMany = array(
        'Location' => array(
            'with' => 'DepartmentsLocation',
            'unique' => true
        )
    );
}
?>

<?php
class DepartmentsLocation extends AppModel {
    var $name = 'DepartmentsLocation';

    var $belongsTo = array(
        'Department',
        'Location'
    );    


    // I'm pretty sure this method is unrelated. It's not being called when this error
    // occurs. Its purpose is to prevent having two HABTM rows with the same location
    // and department.
    function beforeSave() {

        // kill any existing rows with same associations
        $this->log(__FILE__ . ": killing existing HABTM rows", LOG_DEBUG);

        $result = $this->find('all', array("conditions" =>
            array("location_id" => $this->data['DepartmentsLocation']['location_id'],
                  "department_id" => $this->data['DepartmentsLocation']['department_id'])));


        foreach($result as $row) { 
            $this->delete($row['DepartmentsLocation']['id']);
        }

        return true;
    }
}
?>

コントローラーはまったく面白くありません。

問題: の名前を編集すると、それにリンクされていたLocationすべてのが空のURLで再作成されます。モデルはuniqueがtrueであると指定しているため、これにより、すべての新しい行が古い行を上書きし、基本的にすべてのURLが破棄されます。DepartmentsLocationLocation

私は2つのことを知りたいです:私はこれを止めることができますか?もしそうなら、どのように?

そして、あまり技術的ではなく、より気まぐれなメモで:なぜこれが起こるのですか?Cakeでフィールドを編集すると、非常に多くの問題が発生するのは奇妙に思えます。phpMyAdminを簡単に調べて、Locationそこで名前を編集し、期待どおりの結果を得ることができる場合です。行のフィールドを編集しているだけなのに、CakePHPがHABTMデータに触れるのはなぜですか?外部キーすらありません!

4

3 に答える 3

1

CookBookからの最初の問題は次のとおりです。

デフォルトでは、HasAndBelongsToMany関係を保存するとき、Cakeは新しい行を保存する前に結合テーブルのすべての行を削除します。

データに外部キーがないのに、CakeがHABTMデータを保存しようとしている理由はよくわかりませんが、そのための簡単な解決策があります。保存呼び出しの関連付けを破棄するだけです。

$this->Location->unbindModel(
    array('hasAndBelongsToMany' => array('Department'))
);
于 2010-02-16T19:40:06.700 に答える
1

私はこれが起こっているかもしれない1つの理由を考えています。を取得すると、データLocationも取得しlocations_departmentsます。そして、あなたがsave($this->data)それをするとき、それは配列の中のモデルを探して、それらを保存します。

これを解決する方法は、recursive(モデルの)属性を-1または0に設定することです(試してみてください。よくわかりません。データを印刷して、何が表示されるかを確認してください)。モデルで設定することもvar $recursive = -1;、コントローラーメソッド(アクション)で設定することもできます。$this->ModelName->recursive = -1;

再帰の詳細:http://book.cakephp.org/view/439/recursive

それはharpaxが提案したものと本当に似ていますが、そのデータが必要ない場合は、Cakeに伝えて、データをフェッチしないようにします。

于 2010-02-16T20:58:02.410 に答える
0

問題は、を保存するときにLocation、saveメソッドにすべてを含む配列を指定したDepartmentsLocationsことです。したがって、CakePHPはすべてを破壊し、それを再作成しようとします。

これはケーキのよくある間違いです。なぜなら、それはあなたにとってあまりにも多くの結果を引き出すことが多いからです。

保存する必要のあるデータのみを渡すか、必要なデータのみをフェッチすることをお勧めします。

于 2010-05-04T13:26:51.027 に答える