将消息系统实现到cakephp 2.x中

时间:2012-12-04 01:16:29

标签: join message foreign-key-relationship cakephp-2.1

我正在尝试在我的cakephp框架中实现一个消息系统(用户到用户)。 因此我创建了以下表格:

消息

  1. id
  2. 标题
  3. SENDER_ID
  4. 已创建
  5. response_on
  6. Messages_Users

    1. ID
    2. MESSAGE_ID
    3. recipient_id
    4. 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')
              );
      

      }

      MessageUser的模型

       <?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方法正确连接这些表? 我认为将这些模型联系起来已经足够了,所以蛋糕魔术会照顾其余部分。

1 个答案:

答案 0 :(得分:0)

快速回答是你的关联错了。长篇文章如下:

首先,没有名为hasAndBelongsTo的关联。关联名称为hasAndBelongsToMany。此外,您在Message Model中汇总的关联是完全错误的,或者如果我可以这样说 - 您可能没有正确理解它们。因此,快速解决方法是删除hasManyMessageUserbelongsTo User和错误hasAndBelongsTo Message并添加{{ 1}}与用户的关联。

如果您想让hasAndBelongsToMany使用它。如何is described here。 HABTM也在这里讨论了很多次,所以我不打算详细介绍它。

但是我想指出另一种可能的设置。现在我提出这个是因为我看到你试图也使用Message hasAndBelongsToMany User所以有可能使用所谓的hasMany,但通常在你想要存储其他数据时使用连接模型(在您的情况下为MessageUser)。检查this question out