1

私のアプリでは、ユーザーは別のユーザーと友達になることができます。したがって、2 つのテーブル間に多対多の関係があります。このように:Users > Friends < Users

テーブルは次のようになります。

Users:
id
username
password

Friends:
id
user_id_from
user_id_to

モデルを次のように設定しました。

class User extends AppModel
{
    public $name = 'User';

    public $hasOne = 'Profile';

    public $hasMany = array(
        'Post',
        'Answer',
    'Friend'
    );

    public $actsAs = array('Containable');
}

class Friend extends AppModel
{
    var $name = 'Friend';

    var $belongsTo = array(
        'Sender' => array(
            'className' => 'User',
            'foreignKey' => 'user_id_from'
        ),
        'Recipient' => array(
            'className' => 'User',
            'foreignKey' => 'user_id_to'
        )
    );

    public $actsAs = array('Containable');
}

しかし、それらを適切にリンクしていないようですか?

ユーザーモデル内で次のコードを使用します。

public function getFriends($username)
    {
        return $this->find('all', array('conditions' => array('User.username' => $username, 'Friend.status'=>1)

        ));
    }

そして、そのようなURLにアクセスすると/users/USERNAME/friends、その人の友達がリストされます. それを呼び出すメソッドは次のとおりです。

public function index( $username )
{   
    $friends = $this->User->getFriends($username);

    $this->set('friends', $this->paginate());
}

どうしたの?

4

1 に答える 1

2

友人関係の場合は、hasMany の代わりに HABTM を使用する必要があります。

class User extends AppModel
{
    public $name = 'User';

    public $hasOne = 'Profile';

    public $hasMany = array(
        'Post',
        'Answer',
    );

    public $hasAndBelongsToMany = array(
      'Friend' => array(
        'className' => 'User',
        'joinTable' => 'friends',
        'foreignKey' => 'user_id_to',
        'associationForeignKey' => 'user_id_from',
      )
    );

    public $actsAs = array('Containable');
}

現在の Friend モデルは必要なく、Cake を混乱させる可能性があるため削除してください。

メソッドgetFriends()は次のようになります。

public function getFriends($username) {
   return $this->find('all', array(
     'conditions' => array(
       'User.username' => $username, 
       'User.status'=>1
      ),
      'contain' => array(
        'Friend'
      )
   ));
}

ここでは、 User モデルを検索し、そのユーザーのすべての Friend レコードを含めます。Cake は自動的に結合テーブル データを取得し、ユーザー データを含めます。$this->User->getFriends('Jeremy');次のようなデータが返されます。

Array
(
    [User] => Array
        (
            [id] => 1
            [username] => Jeremy
        )
    [Friend] => Array
        (
           [0] => Array
                (
                    [id] => 2
                    [username] => Cameron
                )
           [1] => Array
                (
                    [id] => 3
                    [name] => Mark
                )
           [2] => Array
                (
                    [id] => 4
                    [name] => Bob
                )
        )
)

ここでの各 Friend キーは、実際には User モデルの結果です。

HABTM の詳細については、 http ://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm をご覧ください。

于 2012-04-11T23:32:27.130 に答える