2012-01-04 7 views
1

私はCakePHP 1.3で簡単なメッセージングシステムを実装しようとしています。私がする必要があるのは、ログインしているユーザーが会話しているユーザーの配列を返すためのクエリを実行することです(メッセージの受信、メッセージの送信、またはその両方)。CakePHPメッセージングシステム

そのように私のUserモデルが設定されている

class User extends AppModel { 
    var $name = 'User'; 
    var $actsAs = array('Containable'); 

    var $hasMany = array(

     'SentMessages' => 
     array (
      'className' => 'Message', 
      'foreignKey' => 'sender_id' 
     ), 

     'ReceivedMessages' => 
     array (
      'className' => 'Message', 
      'foreignKey' => 'receiver_id' 
     ) 
    ); 
} 

私はちょうどユーザーとそれに関連するメッセージを取得するために収容可能を使用し、それらに条件を追加することができますが、それぞれの間のものにそれらのメッセージを制限する文を含みますユーザーとログインしたユーザー

$users = $this->User->find('all', array(
    'contain' => array(
     'ReceivedMessages' => array(
      'conditions' => array(
       'receiver_id' => $my_user_id 
      ) 
     ), 
     'SentMessages' => array(
      'conditions' => array(
       'sender_id' => $my_user_id 
      ) 
     ) 
    ) 
)); 

しかし、これはまだ私のDBにすべてのユーザーを返します。任意のSentMessagesまたはReceivedMessagesを持つユーザーのみが返されるようにこのクエリを記述する方法はありますか?

ありがとうございます!

+0

var $hasMany = array( 'Message' => array( 'className' => 'Message', 'foreignKey' => 'conversation_id' ) ); var $belongsTo = array( 'FirstUser' => array( 'className' => 'User', 'foreignKey' => 'first_user_id' ), 'SecondUser' => array( 'className' => 'User', 'foreignKey' => 'second_user_id' ) ); 

は、その後、次の検索を実行しますこのIDのレコード。クエリの出力を確認する - 実際にSQLで条件を適用しているのはケーキですか?また、Cakeがusersテーブルの 'receiver_id'を探している場合は、各条件フィールドにテーブル/モデル名を追加してみることもできます。 – Ross

+0

ええ、それは設定されています。 containsステートメントの条件は機能しています。$ my_user_idへの、または$ my_user_idからのメッセージのみが取り出されます。私の問題は、$ userには、SentMessagesとReceivedMessagesが空の場合でも、自分のDBのすべてのユーザーが含まれているということです。私はそれらのユーザーが全く検索されないようにしたいと思います。 – NathanGaskin

+0

ああ、私は 'User-> find( 'all')'をしているからです。私は働くかもしれない何かを投稿します – Ross

答えて

0

私はそうのような新しい「会話」エンティティを追加することによって、これを解決:私は$のmy_user_id`が確実に設定されている `と仮定して、そこにある

$conversations = $this->Conversation->find('all',array(
    'conditions' => array(
     'OR' => array(
      'Conversation.first_user_id' => $this->my_user_id, 
      'Conversation.second_user_id' => $this->my_user_id 
     ), 
     'Conversation.modified >' => date("Y-m-d H:i:s", $since_timestamp) 
    ) 
); 
1
$users = $this->User->find('first', array(
    'conditions' => array('User.id' => $my_user_id), 
    'contain' => array(
     'ReceivedMessages' => array(
      'conditions' => array(
       'receiver_id' => $my_user_id 
      ) 
     ), 
     'SentMessages' => array(
      'conditions' => array(
       'sender_id' => $my_user_id 
      ) 
     ) 
    ) 
)); 

私の推論は、あなたがallを見つけることが、その検索のための条件を指定していない、あなたの元のコードです。

Cakeは、すべてのユーザと存在するすべてのメッセージを返します。 $users配列に正しいデータが正しい形式で格納されていますが、特定のユーザーのみが必要です。

初期状態に条件を追加することで、あなたは良いことがわかります。

+0

これまでのおかげでありがとう!私は私が望む結果フォーマットについてはっきりとしているとは思わない。私は配列を反復処理することによって適切なフォーマットを得ることができました。 http://pastebin.com/AiuuARpAは、最良の出力フォーマットがあると思うもののクイックダンプです。それはそれをより明確にしますか? – NathanGaskin

関連する問題