0

私は自分自身を助けることができず、それは現在迷惑です、そしてはい、私はグーグルをたくさん使いました。

必要なもの:

ユーザーをフォローするためのTwitterのようなfollowボタン。action

私がすでにしたこと:

データベース

usersテーブル:ID、ユーザー名、パスワード、..。

users_usersテーブル:id、user_id、follower_id

コード

モデル内User.php

public $hasAndBelongsToMany = array(
'Follower' => array(
  'className' => 'User',
  'joinTable' => 'users_users',
  'foreignKey' => 'user_id',
  'associationForeignKey' => 'follower_id',
  'unique' => 'keepExisting',
) 
);

UsersController.php

public function follow() {
/*need help here*/
}

Users\index.ctp

<?php if ($current_user['id'] != $user['User']['id']) echo $this->Html->link('Follow', array('action' => 'follow', $user['User']['id'])); ?>
4

1 に答える 1

0

個人的には、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

于 2013-03-25T10:46:26.433 に答える