我的CakePHP应用程序有以下表格,允许用户之间建立友谊:
**Users**
id
username
password
**Profiles**
id
firstname
lastname
user_id
**Friends**
id
user_id_to
user_id_from
status
所以基本上用户有一个配置文件,用户可以和另一个用户成为朋友,并且这被记录在名为friends的数据库表中,其简单状态为已确认或未使用0或1(它是一个int)。所以朋友是两个用户之间的联系。
我正在尝试为用户列出朋友,例如,如果我得到的网址如下:
/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
看起来应用程序认为外键在User表而不是朋友表中,即使他们在Friend关联中调用了......任何想法是什么问题?
答案 0 :(得分:0)
在构造连接查询时,Cake似乎对这些foreignKey赋值感到困惑。
您可以尝试使用以下内容替换每个关系以强制使用右连接语句:
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')
)
);
答案 1 :(得分:0)
每次为$ belongsTo指定外键时,请记住您指定的名称是当前表中字段的名称,而不是其他表。
因此,例如,您对'foreignKey' => 'user_id_to'
的$ belongsTo引用应该位于好友模型中,而不是用户模型。
重新阅读Cake的文档,因为它确实令人困惑(即使在多年的Cake应用程序之后,我仍需要在开始新项目时刷新):http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html