HATBM は、この状況には適していません。クックブックから:
HABTM データは完全なセットのように扱われます。新しいデータの関連付けが追加されるたびに、データベース内の関連付けられた行の完全なセットが削除され、再度作成されるため、保存するために常にデータ セット全体を渡す必要があります。HABTM を使用する代わりの方法については、hasMany から (結合モデル) を参照してください。
このため、HABTM は主にかなり「ばかげた」関係に適しています。ユーザーが多くの興味を選択する必要がある場合などに使用しました。チェックボックスのリストを取得するだけで、複数の興味をクリックしてすべてを 1 回のヒットで保存できます。
あなたの場合、独自のモデルを持つ別のテーブルを持つ方が簡単です。私はそれをリレーションシップまたはそれに似たものと呼んでいます。id、 followed_by_id 、 following_id 、および必要なその他のフィールドが含まれます。
古い Cake 1.3 アプリからいくつかのコードを掘り起こしましたが、役に立つはずです。リレーションシップ モデルは次のようになります。
<?php
class Relationship extends AppModel {
var $name = 'Relationship';
var $belongsTo = array(
'FollowedBy' => array(
'className' => 'User',
'foreignKey' => 'followed_by_id'
),
'Following' => array(
'className' => 'User',
'foreignKey' => 'following_id'
)
);
}
?>
ユーザーのモデルには、次のような関係が必要です。
var $hasMany = array(
'Followers' => array(
'className' => 'Relationship',
'foreignKey' => 'following_id',
'dependent'=> true
),
'FollowingUsers' => array(
'className' => 'Relationship',
'foreignKey' => 'followed_by_id',
'dependent'=> true
),
);
次に、関係コントローラーには、次のようなメソッドがあります。
function add($following_id = null) {
$this->Relationship->create();
$this->Relationship->set('followed_by_id',$this->Auth->User('id'));
$this->Relationship->set('following_id',$following_id);
$this->Relationship->save();
$this->redirect($this->referer());
}
function delete($id = null) {
$this->Relationship->delete($id);
$this->redirect($this->referer());
}
そのコードでは、GET リクエストを使用してデータベースを変更していることに注意してください。これは実際には行うべきではありません (何年も前の古いコードです)。add メソッドと delete メソッドの両方に対して POST リクエストを強制する必要があります。これらはデータベースを変更するためです。
それでも、そのコードは正しい軌道に乗るはずです。