CakePHPのHABTM:編集1つの項目casusesのHABTMの行を再作成を取得するためには、余分なデータを破壊します

StackOverflow https://stackoverflow.com/questions/2275353

質問

私は、CakePHPの私のHABTM関係でトラブルを抱えています。

Department HABTMのLocation

私はそうのような二つのモデルを持っています。一つの大企業は、多くの建物があり、それぞれの建物は、サービスの数が限られています。 HABTM関係そのものに加えて、各HABTM行はまた、ユーザーは、彼らが興味を持っていると、それは建物でどのように動作するか、彼らは」サービスに関する追加情報を見つけるために訪問することができますurlフィールドを持っているように、各建物はまた、独自のWebページを持っています興味を持って再ます。

私はそうのようなモデルを設定しました。

<?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の名前を編集した場合、そのDepartmentsLocationにリンクされたLocationsのすべては、空のURLで再作成されます。モデルはユニークが真であることを指定するので、これはまた、実質的にすべてのURLを破壊する、古い行を上書きするために、新しい行のすべてを引き起こします。

私は二つのことを知っていただきたいと思います。 私はこれを停止することはできますか?もしそうなら、どのように?

そして、以下の技術的およびよりwhineyノートに:なぜこれがさえ起こるのでしょうか?私が簡単に、phpMyAdminを経るがLocation名を編集し、私が期待する正確な結果を得ることができたときにケーキを通じてフィールドを編集することは、そんなにトラブルを起こすべきだと私には奇妙なようです。私はちょうど行のフィールドを編集していたときに、なぜCakePHPはHABTMデータに触れていますか?それも、外部キーではありません!

役に立ちましたか?

解決

クックブックから、第一の問題は、次のとおりです。

  

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

私はなぜケーキは、あなたのデータの外部キーを持っていないにもかかわらず、HABTMデータを保存しようとしているが、そのための簡単な解決策があると非常によくわかりません。単にの関連付けを破壊します呼び出し保存します:

$this->Location->unbindModel(
    array('hasAndBelongsToMany' => array('Department'))
);

他のヒント

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

これを解決する方法は、の-1 のへの(モデルの)recursive属性を設定するか、されるの0 の(だけをプリントアウトし、私はわからないんだけど、してみてくださいデータ)が出てくるかを確認します。 var $recursive = -1;またはコントローラのメソッド(アクション)に:あなたはモデルでそれを設定することができます$this->ModelName->recursive = -1;

再帰についての詳細: http://book.cakephp.org/view/439/recursive

これは本当に似ています何の harpaxあなたはそれを取得しないように、ケーキにそれを伝え、そのデータを必要としないだけであれば、提案の。

トラブルは、あなたのLocationを保存するとき、保存方法にあまりにもすべてDepartmentsLocationsを含む配列を与えたということです。したがって、CakePHPはすべてのものを破壊し、それを再作成してみます。

それは多くの場合、あなたのためにあまりにも多くの結果を引っ張ってくるので、

これはケーキと共通の間違いです。

あなたが必要なだけ件のデータを取得するために保存する必要がある、またはより良いデータだけを渡すようにしてくださいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top