CakePHP已经并且属于许多没有像预期的那样链接


CakePHP hasAndBelongsToMany not linking as expected

我有三个表:用户、个人资料和朋友。

它们的连接方式如下:

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]所以有些东西无法正常工作......

谁能帮忙?

我尝试在模型中将他的名字"和属于许多人"更改为"朋友",但这引发了一个错误,即该表没有取消......所以这也不是解决方案。

表:

**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`)

相关模型的模型和别名应该是唯一的。在您的情况下,问题是:

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

如果friends是连接表名,则可以使用 Friend 作为友元用户的别名。

第二件事是你试图同时包含User => ProfileUser => Friend => Profile这可能也是有问题的。

根据我的经验,深度contain可能会变得非常低效。您可以考虑从包含中删除好友Profile,然后提取好友用户 ID 并单独获取配置文件。

您的Friend模型没有user_id这就是为什么User模型无法与Friend联系的原因。尝试以下操作:

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);
}

我想你正在寻找这样的东西:

用户.php

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

这会在 habtm 关系中将用户表别名为自身的好友。为了保持约定,应使用 user_id 键和friend_id键调用联接表friends_users

这是我通过我制作的测试应用程序获得的结果(只需添加您的条件):

$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'
                )
            )
        )
    )
)