0

私は自分の問題の解決策に出くわしたと思いましたが、それでも私のアプローチは私のすべてのニーズに適合していません。したがって、私はあなたの提案に頼ります。基本的に私が達成したいことは次のとおりです。

私は3つのデータベーステーブルを持っています:

  • ユーザー:id、ユーザー名、..。
  • private_messages:id、..。
  • private_messages_users:id、private_message_id、sender_id、recipient_id、status

このデータベーススキーマを表示すると、メッセージごとに結合テーブルに行を作成します。つまり、2人の受信者にメッセージを送信すると、結合テーブルに2つの行が挿入されます。あなたがより良い異なるアプローチを持っているなら、私は提案を受け入れます。

次のことを行うには、関連付けを定義する必要があります。

  • メッセージを作成することができます。作成フォームに、メッセージを送信する受信者を選択できる複数のリストが必要です。保存する前に送信者を$this->data配列に手動で追加するため、ここでは送信者は重要ではありません。
  • 受信トレイと送信済みフォルダを作成できます。ここで、受信したすべてのメッセージをそれぞれ取得し、送信します
  • 送信されたメッセージを、送信先のすべての受信者と一緒に表示できる
  • ユーザーがメッセージを初めて表示したときに、メッセージを既読としてマークできる
  • また、sender_idとrecipient_idごとに、usersテーブルからユーザー名を取得したいと思います。

要求されたすべてのアクションを「cakily」で完了してください。つまり、「ハック」や配列を変換するメソッドはありません。作成された関連付けに完全に基づいた、単なる単純な操作。

私はこの問題に1週間以上苦労しているので、どんな助けでも大歓迎です。どうもありがとうございます!

4

1 に答える 1

0

次のようなセットアップが必要になると思います: UsershasManyUserMessageそしてUserMessageUsers、HABTM テーブルを表すモデルを作成します。readそのテーブルには、受信者がメッセージを読んだかどうか、およびどの受信者が読んだかを示すという列があります。

これは、アイデアを視覚化できるように、私が話していることの例を設定するために実行できる SQL です。

CREATE TABLE `users` (                                        
  `id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,             
  `name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,   
  `email` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,  
   PRIMARY KEY (`id`)                                          
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

CREATE TABLE `user_messages` (
  `id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,               
  `user_id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,          
  `subject` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,  
  `body` TEXT COLLATE utf8_unicode_ci,         
  PRIMARY KEY (`id`)          
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

CREATE TABLE `user_messages_users` (                            
  `id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,               
  `user_message_id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,  
  `user_id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,          
  `read` TINYINT(1) DEFAULT '0',                                
  PRIMARY KEY (`id`)                                            
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

すべてに UUID を使用するため、CHAR(36)列を使用します。

たとえば、ユーザーが「Bob」が「Sally」と「Bill」にメールを送信するとuser_messages、作成者として「Bob」に戻るリンクが含まれる 1 つのレコードが作成されます。次に、特定のレコードを「Sally」と「Bill」の両方user_messages_usersにリンクする2 つのレコードがあります。user_messages

ここで、「サリー」がメッセージを読むと、特定のuser_messages_usersレコードのread列が 1 に変わり、彼女がメッセージを読んだことを示します。"Bob" のレコードは 0 のままです -- 彼がそれを読んでいないことを示します。

HABTM テーブルで変更を行うには、モデルを作成する必要があります。CakePHP の本では、これについて、特にwithリレーションシップのオプションについて説明しています。

于 2011-02-10T00:12:49.467 に答える