0

私は CakePHP 2 を使用してフォロワー/フォロー システムに取り組んでいます。ユーザー テーブルと user_users テーブルを使用してデータベースをセットアップしました。users テーブルはシステム上のすべてのユーザーを含むメイン テーブルであり、user_users テーブルにはフォロワーのレコードが含まれます。

次に、UsersController、User モデル、および Follower モデルを作成します。

現在ログインしているユーザーが、表示しているプロファイルが属するユーザーをフォローしているかどうかに応じて、フォローまたはフォローのいずれかを示すボタンを正常に出力できますが、その方法を理解できないのは、新しいフォロー関係を作成することですテーブルで。つまり、user_users テーブルにレコードを作成する方法がわかりません。

これのロジックがどこに行くべきか、つまり、「フォロー」ボタンが何を指しているのかわかりません。

これはおそらく非常に単純な質問ですが、私は完全に困惑しています。「フォロー」アクションを UsersController に追加しようとしましたが、それを機能させることができません。

どんな助けでも大歓迎です、ダンカン

4

1 に答える 1

2

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 リクエストを強制する必要があります。これらはデータベースを変更するためです。

それでも、そのコードは正しい軌道に乗るはずです。

于 2013-08-07T11:30:16.153 に答える