1

ユーザー、プロファイル、友達の 3 つのテーブルがあります。

それらは次のように接続されています。

public $name = 'User';

    public $hasOne = 'Profile';

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

    public $hasAndBelongsToMany = array(
        'User'=>array(
            'className'              => 'User',
            'joinTable'              => 'friends',
            'foreignKey'             => 'user_from',
            'associationForeignKey'  => 'user_to'
        )
    );

プロファイル モデルは所属するユーザーにすぎないため、ここでは示していません。友人モデルは、ユーザー モデルで関連付けを行うことによって仮想化されます。

したがって、ユーザーの友達のリストを取得します。フレンドコントローラーで次のようにユーザー名を渡します。

public function index( $username )
{   
    $friends = $this->User->find('first', 
        array(
            'conditions'=>array(
               'User.username'=>$username
            ),
            'contain'=>array(
                'Profile',
                'Friend'=>array(
                    'conditions'=>array(
                        'Friend.status'=>1
                    ),
                    'contain'=>'Profile'
                )
            )
        )
    );

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

友達のデータとそこに関連付けられているプロファイル情報を取得する必要があります。

ただし、このエラーが発生します。Model "Friend" is not associated with model "Profile" [APP/Cake/Model/Behavior/ContainableBehavior.php, line 339]何かが正しく機能していません...

誰でも助けることができますか?

モデルで he hasAndBelongsToMany の名前を Friends に変更しようとしましたが、テーブルが一意ではないというエラーがスローされるため、それも解決策ではありません。

テーブル:

**users**
id
username
password

**profiles**
id
name
user_id

**friends**
id
user_from
user_to
status

モデルを次のように変更すると:

public $hasAndBelongsToMany = array(
        'Friend'=>array(
            'className'              => 'Friend',
            'joinTable'              => 'friends',
            'foreignKey'             => 'user_from',
            'associationForeignKey'  => 'user_to'
        )
    );

次に、次のエラーが表示されます。

Database Error
Error: SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'Friend'

SQL Query: SELECT `Friend`.`id`, `Friend`.`user_from`, `Friend`.`user_to`, `Friend`.`created`, `Friend`.`status`, `Friend`.`id`, `Friend`.`user_from`, `Friend`.`user_to`, `Friend`.`created`, `Friend`.`status` FROM `db52704_favorr`.`friends` AS `Friend` JOIN `db52704_favorr`.`friends` AS `Friend` ON (`Friend`.`user_from` = 6 AND `Friend`.`user_to` = `Friend`.`id`)
4

3 に答える 3

2

モデルと関連モデルのエイリアスは一意である必要があります。あなたの場合、問題は次のとおりです。

public $name = 'User';
...
public $hasAndBelongsToMany = array(
    'User'=>array(
    ...

が結合テーブル名である場合は、フレンド ユーザーのエイリアスとしてfriends使用できます。Friend

User => Profile2 つ目は、両方を封じ込めようとしているということですUser => Friend => Profile。これもおそらく問題です。

私の経験では、deep contains は非常に非効率になる可能性があります。コンテインからフレンドを削除してProfileから、フレンドのユーザー ID を抽出し、プロファイルを個別に取得することを検討してください。

于 2012-05-05T22:10:28.797 に答える
1

私はあなたがこのようなものを探していると思います:

User.php

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

これにより、ユーザーテーブルは、habtm関係でそれ自体のフレンドとしてエイリアス化されます。慣例を守るために、結合テーブルはキーを使用して呼び出す必要がfriends_usersありuser_idますfriend_id

これが私が作ったテストアプリで得た結果です(条件を追加するだけです):

$this->User->contain(array(
            'Profile',
            'Friend' => array(
                'Profile',
            ),
        ));
debug($this->User->find('all', array('conditions' => array('User.id' => 1))));

array(
    (int) 0 => array(
        'User' => array(
            'id' => '1',
            'name' => 'user1'
        ),
        'Profile' => array(
            'id' => '1',
            'user_id' => '1'
        ),
        'Friend' => array(
            (int) 0 => array(
                'id' => '2',
                'name' => 'user2',
                'FriendsUser' => array(
                    'id' => '1',
                    'user_id' => '1',
                    'friend_id' => '2'
                ),
                'Profile' => array(
                    'id' => '2',
                    'user_id' => '2'
                )
            )
        )
    )
)
于 2012-05-10T21:42:52.583 に答える
1

あなたのFriendモデルには何もありません。それが、モデルが と接触できないuser_id理由です。以下を試してください。UserFriend

public function index( $username )
{   
    $this->User->Behaviors->attach('Containable');
    $friends = $this->User->find('first', 
        array(
            'conditions'=>array(
               'User.username'=>$username
            ),
            'contain'=>array(
                'Profile',
                'Friend'=>array(
                    'conditions'=>array(
                        'Friend.status'=>1
                    )
                )
            )
        )
    );

    $this->set('friends', $friends);
}
于 2012-05-06T04:18:37.707 に答える