2012-01-07 12 views
2

まだ暗いです。CakePHP HABTM - 私はそれを理解していません

cakePHP HABTM, am I getting it all wrong?

は、もう一度試してます:
は、私は2つのテーブルを持っている:storesmanagers
私は新しいテーブル、managers_storesを作成し、各ストアの飼い葉桶の完全なリストを維持するためにそれを使用したいと思います。
完全なレコードデータを提供するアクションは、テーブル行を削除する結果となり、新しいレコードのみが保持されることを理解しました。
これは私のためのUNDESIRED動作ですニーズ。では、アプリケーションのHABTM情報をどのように管理すればよいですか?保存したデータを削除するというアイデアは何ですか?

おかげ

答えて

7

save()は関係のunique値がtrueある場合にのみsaveAll()で保存すると、あなたが保存している特定のモデル、ためmanagers_storesエントリを切り捨てるだろう、何も削除されません。これは、手動で完全に明らかにされていません。

unique:true(デフォルト値)ケーキは最初のレコードを更新する際に、新しいものを挿入する前に、外部キーテーブル内の既存の関連レコードを削除します。したがって、既存の関連付けを更新するときに再度渡す必要があります。あなたsave()個々のレコードは、それだけで、個々のレコードは触れることになるたび

http://book.cakephp.org/1.3/en/view/1044/hasAndBelongsToMany-HABTM


Managerと同じようにStoreのレコードが関連付けられている場合、managers_storesリンクはリセットされ、保存したレコードにあったストアだけがマネージャに関連付けられます。例えば。 (擬似コードで):今HABTM店4、5及び6

  • マネージャHABTM格納1、2及び3
  • Manager->saveAll(array('Manager' => ..., 'Store' => array(4, 5, 6)))
  • マネージャー。既存の団体はそう

を上書きし、どちらかのあなたは、この動作が好き、または手動でHABTMレコードを管理していない場合falseに関連してunique値を設定しました。かなり正直なところ、複雑なアプリケーションの中途半端な場合には、CABの自動化されたHABTM関係の処理は非常に脆弱でデバッグが難しいので、私は常にHABTMレコードを自分で管理します。

$this->Manager->save(...); 
$this->Manager->ManagersStore->save(array('manager_id' => $this->Manager->id, 
              'store_id' => 42)); 
+0

ありがとうございます。私はそのようにします。私は本当になぜそれが..このデフォルトの動作の背後にあるログインは何かを理解していないのですか? – yossi

+0

デフォルトでは、モデルの「絶対状態」が保存されます。マネージャーレコードを保存するように指示しています。これは、店舗4,5,6に関連付けられています。これは、マネージャーが店舗4,5,6を持っていることを意味します。これは理にかなっています1つのインターフェイス(通常、関連タグ付きのブログ記事)内で管理される関連性の少ない単純なモデルの場合 – deceze

1

は「は、多くに属して」オブジェクトが緩く一緒に結び付けられているところです。 storesmanagersのアナロジーを使用した場合、1つの店舗には多くの管理者がおり、1つの店舗には多くの店舗があります(その動作方法は不明です、おそらくロービングマネージャーですか?:P)。

まず、マネージャーストアで使用する例はHABTMではないと思います。ただ一つのstoreには多くのものがあるmanagersで、多くはstoresではありません。ここでHABTMを使用すると、複数の店舗に同時に所属することができます。しかし、私はとにかく説明します。

HABTMを使用する場合、この関係にはおそらくmanager_storesなどと呼ばれる中間テーブルが必要です。自動化されたツールを使用している場合、これはCakePHPによって自動的に設定されます。これにより、無制限の数のマネージャーを無制限の数の店舗にリンクすることができます。

レコードを更新および削除すると、MySQLの関係(InnoDBエンジンを使用する必要があります)の設定によって異なります。

これは、を使用している関係の種類に関係なくです。

phpMyAdminを使用している場合は、テーブルの構造ビューに移動します。次に、「関係ビュー」をクリックします。

InnoDBを正しく設定すると、関係と2つの列が "ON UPDATE"と "ON DELETE"と表示されます。これは、レコードを変更するときの動作を決定します。

さまざまなタイプのON DELETEアクションとON UPDATEアクションを説明しています。リレーショナルデータベースのクエリを調べてみてください!

私はこれが少し助けてくれることを願っています。私はあなたが持っている質問に喜んで答えます!

+0

@Kieranに感謝します。ご注意ください:それぞれのマネージャーができます!複数の店舗を管理し、各店舗を多くの管理者が管理することができます。 私が言及した3番目のテーブルは、あなたが書いた中間テーブルとしてケーキが使用しているテーブルです。 私の問題は、ケーキのドキュメントによって、そのテーブルに保存された各アクションが最初にテーブルの内容を削除し、新しいレコードのみを保存するということです。 – yossi

+0

@yossiああ、私はあなたが意味するものを参照してください。これをあなた自身で試しましたか?あなたは実際にこの問題を経験しているのですか? – Kieran

+0

マニュアルにあります。 – yossi

関連する問題