CakePHP PrivateMessage Схема и Ассоциации - PullRequest
0 голосов
/ 09 декабря 2010

Я думал, что нашел решение своей проблемы, но, тем не менее, мой подход не соответствует всем моим потребностям.Поэтому я прибегаю к вашим предложениям.Вот в основном то, чего я хочу достичь:

У меня есть 3 таблицы базы данных:

  • users: id, username, ...
  • private_messages: id,...
  • private_messages_users: id, private_message_id, sender_id, receient_id, status

Просматривая эту схему базы данных, вы заметите, что для каждого сообщения, которое я создаю в таблице соединения, создается строка, котораяозначает, что если я отправлю сообщение двум получателям, в соединительной таблице будет две вставленные строки.Если у вас есть другой подход лучше, я открыт для предложений.

Мне нужно определить ассоциации для того, чтобы:

  • иметь возможность составить сообщение;в форме составления я хотел бы иметь несколько списков, из которых я могу выбрать получателей, которым я хотел бы отправить сообщение;отправитель здесь не важен, так как я добавлю его вручную в массив $ this-> data перед сохранением
  • , чтобы иметь возможность создать папку «Входящие» и «Отправленную», где я получу все полученные сообщения, соответственно,отправлено
  • возможность просматривать отправленное сообщение вместе со всеми получателями, которым оно было отправлено
  • иметь возможность пометить сообщение как прочитанное, когда пользователь просматривает его впервые
  • Кроме того, для каждого sender_id и receient_id я хотел бы получить имя пользователя из таблицы пользователей

Я хотел бы, чтобы все запрошенные действия были выполнены «cakily», что означает отсутствие «хаков» или методовпреобразовать массивы.Просто простые операции, основанные исключительно на созданных ассоциациях.

Любая помощь будет принята с благодарностью, так как я борюсь с этой проблемой более недели.Большое спасибо!

1 Ответ

0 голосов
/ 10 февраля 2011

Я полагаю, что вам понадобится такая настройка: Users hasMany UserMessage, а затем создайте модель 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).

Итак, скажем, пользователь: «Боб» отправляет электронное письмо «Салли», а «Билл» будет содержать одну запись в user_messages, которая ссылается на «Боба» как создателя. Тогда в user_messages_users будет две записи, которые связывают конкретную запись user_messages с «Салли» и «Биллом»

Теперь, если «Салли» читает сообщение, конкретная запись user_messages_users изменит свой столбец read на 1, указывая, что она прочитала сообщение. Запись "Боба" останется 0 - чтобы указать, что он не прочитал ее.

Чтобы внести изменения в таблицу HABTM, вам необходимо создать модель для нее. В книге CakePHP говорится об этом , в частности, о параметре with для отношений.

...