0

メッセージシステム(ユーザー間)をcakephpフレームワークに実装しようとしています。したがって、次のテーブルを作成しました。

メッセージ

  1. id
  2. タイトル
  3. sender_id
  4. 作成した
  5. response_on

Messages_Users

  1. id
  2. message_id
  3. receive_id

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とmessages_usersの結合を実行し、テーブルmessages_usersのuser_idがrecipient_idと等しいデータのセットを選択する必要があります。

しかし、私が得るのはrecipient_id、where句で列が見つからなかったというエラーだけです。

これらのテーブルを適切に結合するようにfindメソッドに指示するにはどうすればよいですか?モデルをリンクするだけで十分だと思ったので、残りはケーキの魔法でやってくれます。

4

1 に答える 1

0

簡単な答えは、あなたの関連付けが間違っているということです。長いものは次のとおりです。

そもそも という協会はありませんhasAndBelongsTo。協会名はhasAndBelongsToMany. さらに、あなたがまとめた連想はMessage Model完全に間違っているか、このように言えば、あなたはそれらを正しく理解していない可能性があります。したがって、簡単な修正は、hasManyto MessageUser、 the 、belongsTo Userおよび wrongを削除し、関連付けを User にhasAndBelongsTo Message追加することです。hasAndBelongsToMany

あなたがMessage hasAndBelongsToMany Userちょうどそれを使用したい場合。方法はこちらに記載しています。また、HABTM についてはここで何度も議論されているので、詳しくは説明しません。

ただし、別の可能な設定を紹介したいと思います。これを提案するのは、あなたも使用しようとしhasManyたので、いわゆる を使用する可能性があるためですhasManyThrough the Join Modelが、通常は結合モデルに追加データを保存する場合に使用されます (あなたの場合は MessageUser )。この質問をチェックしてください。

于 2012-12-04T08:16:07.883 に答える