我有三个表:用户,个人资料和朋友。
他们是这样连接的:
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'
)
);
并且配置文件模型只是一个belongsTo用户,所以我没有显示,并且通过在用户模型中进行关联,Friends模型是虚拟的。
为了获得用户的朋友列表。我在好友控制器中传递了这样的用户名:
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]
因此某些内容无效......
有人可以帮忙吗?
我尝试在模型中将hasAndBelongsToMany的名称更改为Friends,但是会抛出一个表格并非unqiue的错误......所以这也不是解决方案。
表:
**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`)
答案 0 :(得分:2)
相关模型的模型和别名应该是唯一的。在您的情况下,问题是:
public $name = 'User';
...
public $hasAndBelongsToMany = array(
'User'=>array(
...
如果friends
是联接表名称,则可以使用Friend
作为朋友用户的别名。
第二件事是你试图同时包含User => Profile
和User => Friend => Profile
,这可能也有问题。
根据我的经验,深contain
s可能效率很低。您可以考虑从包含中删除朋友的Profile
,然后提取朋友用户ID并单独获取配置文件。
答案 1 :(得分:1)
您的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);
}
答案 2 :(得分:1)
我认为你正在寻找这样的东西:
user.php的
public $hasAndBelongsToMany = array(
'Friend'=>array(
'className' => 'User',
'joinTable' => 'friends',
'foreignKey' => 'user_from',
'associationForeignKey' => 'user_to'
)
);
这将在一个habtm关系中将User表作为自己的朋友别名。为了与约定保持一致,应使用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'
)
)
)
)
)