個人的には、hasAndBelongsToManyがこのような状況に適しているとは思いません。チェックボックスのリストまたは選択リストを表示し、ユーザーが1つのフォームですべてのフォロー(または関係が何であれ)を選択/管理できるようにする場合に最適です。
それは私の個人的な好みかもしれませんが、あなたのような状況では、そのユーザーに関連する他のリンクを気にせずに単一のリンクを追加/削除する場合は、別の「関係」(または同様の名前)を作成することを好みます)モデル/コントローラー、およびすべての種類の「自動的に」管理されるhasAndBelongsToManyリンクとは対照的に、レコードをそれ自体で物と見なします。
これが私がそれをする方法です:
users_usersテーブルに「relationships」という名前を付けます。そして、どのユーザーがフォロワー/フォロワーであるか(それが単語だった場合)に関するあいまいさを避けるために、列に「followed_by_id」および「following_id」(または同様のもの)という名前を付けます。
ユーザーモデルでは、次の関係があります。
var $hasMany = array(
'Followers' => array(
'className' => 'Relationship',
'foreignKey' => 'following_id',
'dependent'=> true
),
'FollowingUsers' => array(
'className' => 'Relationship',
'foreignKey' => 'followed_by_id',
'dependent'=> true
),
);
次に、次のような関係モデルが作成されます($ belongsTo関係が重要な部分です)。
<?php
class Relationship extends AppModel {
var $name = 'Relationship';
var $validate = array(
'followed_by_id' => array(
'numeric' => array(
'rule' => array('numeric'),
),
),
'following_id' => array(
'numeric' => array(
'rule' => array('numeric'),
),
),
);
var $belongsTo = array(
'FollowedBy' => array(
'className' => 'User',
'foreignKey' => 'followed_by_id'
),
'Following' => array(
'className' => 'User',
'foreignKey' => 'following_id'
)
);
}
?>
そして、Relationshipsコントローラーには、次のようなものがあります。
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);
if ($this->Relationship->save($this->data)) {
// all good
} else {
// You could throw an error here if you want
$this->Session->setFlash(__('Error. Please, try again.', true));
}
$this->redirect($this->referer());
}
次に、リレーションシップを追加するには、リレーションシップコントローラーのaddメソッドを呼び出すだけです。
注:理想的には、関係を追加するとデータベースが変更されるため、通常のURLからアクセスするGETリクエストを使用して行うべきではありません。POSTを介してフォームを送信することで実行する必要があります。GETとの通常のリンクを介してそれを行うのがとても簡単な場合、それはやり過ぎに思えることを私は知っています。この例ではわざわざforms/POSTを使用していませんが、ベストプラクティスに固執したい場合は、それを実行する必要があります。詳細については、こちらをご覧ください:https ://softwareengineering.stackexchange.com/questions/188860/why-shouldnt-a-get-request-change-data-on-the-server