CakePHPのHABTM:編集1つの項目casusesのHABTMの行を再作成を取得するためには、余分なデータを破壊します
-
21-09-2019 - |
質問
私は、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
にリンクされたLocation
sのすべては、空の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はすべてのものを破壊し、それを再作成してみます。
これはケーキと共通の間違いです。
あなたが必要なだけ件のデータを取得するために保存する必要がある、またはより良いデータだけを渡すようにしてくださいます。