0

ユーザー間の友情を可能にするCakePHPアプリの次の表があります。

**Users**
id
username
password

**Profiles**
id
firstname
lastname
user_id

**Friends**
id
user_id_to
user_id_from
status

したがって、基本的にユーザーはプロファイルを持っており、ユーザーは別のユーザーと友達になることができます。これは、確認済みまたは0または1(int)を使用しないという単純なステータスでfriendsというデータベーステーブルに記録されます。つまり、友達は2人のユーザー間の結合です。

ユーザーの友達を一覧表示しようとしているので、たとえば次のようなURLを取得した場合:

/people/cameron/friendsユーザーCameronの友達が一覧表示されます。

ただし、findステートメントでユーザーを渡し、それらを見つけて(プロファイルデータが含まれていることに注意してください)、そのユーザーに関連する友達を一覧表示するのに苦労しています。誰か助けてもらえますか?

フレンド、ユーザー、プロファイルのモデルは次のとおりです。

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

    public $belongsTo = array('User');

    public $actsAs = array('Containable');

}

User.php

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

    public $hasOne = 'Profile';

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

public $belongsTo = array(
        'Friend' => array(
            'foreignKey' => 'user_id_from'
        )
    );

    public $actsAs = array('Containable');

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

Profile.php

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

    public $belongsTo = 'User';

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

これは、ユーザーの友達リストを表示するための私の方法です。

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

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

現在、次のエラーが発生しています。

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'User.user_id_from' in 'on clause'
SQL Query: SELECT `User`.`id`, `User`.`username`, `User`.`password`, `User`.`email`, `User`.`status`, `User`.`code`, `User`.`lastlogin`, `Friend`.`id`, `Friend`.`user_id_from`, `Friend`.`user_id_to`, `Friend`.`datetime`, `Friend`.`status` FROM `db52704_favorr`.`users` AS `User` LEFT JOIN `db52704_favorr`.`friends` AS `Friend` ON (`User`.`user_id_from` = `Friend`.`id`) WHERE `User`.`username` = 'cameron' AND `Friend`.`status` = 1

フレンドアソシエーション内で呼び出したにもかかわらず、アプリは外部キーがフレンドテーブルではなくユーザーテーブルにあると見なしているように見えます...問題は何ですか?

4

2 に答える 2

0

Cakeは、結合クエリを作成するときに、これらの外部キーの割り当てによって混乱しているように見えます。

各リレーションを次のように置き換えて、正しい結合ステートメントを強制することができます。

public $hasMany = array(
    'Friend' => array(
        'foreignKey' => null,
        'conditions' => array('Friend.user_id_to = User.id')
    )
);

public $belongsTo = array(
    'Friend' => array(
        'foreignKey' => null,
        'conditions' => array('Friend.user_id_from = User.id')
    )
);
于 2012-04-09T22:17:59.813 に答える
0

$belongsTo に外部キーを指定するときはいつでも、指定する名前は現在のテーブルのフィールドの名前であり、他のテーブルの名前ではないことに注意してください。

たとえば、 $belongsTo への参照は、 Users モデルではなくFriends モデル'foreignKey' => 'user_id_to'にある必要があります。

ややこしいので、Cake のドキュメントを読み直してください (何年にもわたって Cake アプリを使用した後でも、新しいプロジェクトを開始するときに更新する必要があります): http://book.cakephp.org/2.0/en/models/associations- linking-models-together.html

于 2012-04-09T22:30:52.130 に答える