我正在尝试在我的cakephp
框架中实现一个消息系统(用户到用户)。
因此我创建了以下表格:
Messages_Users表用于存储每个已发送邮件的收件人。 然后创建相应的模型,并建立模型之间的关系。
<?php class Message extends Model{
public $hasMany = array(
'MessageUser'=>array(
'className'=>'MessagesUser',
'foreign Key'=>'message_id')
);
public $belongsTo = array (
'User' =>array(
'className'=>'User',
'foreignKey'=>'sender_id')
);
public $hasAndBelongsTo = array(
'Message'=>array(
'className'=>'Message',
'foreignKey'=>'response_on')
);
}
<?php
class MessageUser extends Model{
public $belongsTo = array (
'User'=>array(
'className'=>'User',
'foreignKey'=>'user_id'),
array(
'Message'=>array(
'className'=>'Message',
'foreignKey'=>'message_id')
)
);
class User extends AppModel{
public $hasAndBelongsTo = array(
'Message'=>array(
'joinTable' =>'messages_users',
'className' =>'Message',
'foreignKey' =>'recipient_id',
'associationForeignKey' =>'message_id')
);
现在我想在我的MessagesController中实现一个函数inbox(),它显示存储在数据库中的所有消息,这些消息被发送给相应的用户。 所以我的方法是将函数放入MessagesController
public function inbox(){
$uid = $this->Auth->user('id');
$messages = $this->Message->find('all', array(
'conditions' => array(
'recipient_id' => $uid)
)
);
上面的函数应该通过message_id对表消息和messages_users执行连接,并选择表messages_users的user_id等于recipient_id的数据集。
但我得到的是一个错误,说明在where子句中找不到列recipient_id
。
如何指示find方法正确连接这些表? 我认为将这些模型联系起来已经足够了,所以蛋糕魔术会照顾其余部分。
答案 0 :(得分:0)
快速回答是你的关联错了。长篇文章如下:
首先,没有名为hasAndBelongsTo
的关联。关联名称为hasAndBelongsToMany
。此外,您在Message Model
中汇总的关联是完全错误的,或者如果我可以这样说 - 您可能没有正确理解它们。因此,快速解决方法是删除hasMany
至MessageUser
,belongsTo
User
和错误hasAndBelongsTo
Message
并添加{{ 1}}与用户的关联。
如果您想让hasAndBelongsToMany
使用它。如何is described here。 HABTM也在这里讨论了很多次,所以我不打算详细介绍它。
但是我想指出另一种可能的设置。现在我提出这个是因为我看到你试图也使用Message hasAndBelongsToMany User
所以有可能使用所谓的hasMany
,但通常在你想要存储其他数据时使用连接模型(在您的情况下为MessageUser)。检查this question out。