2010-12-09 2 views
0

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

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

  • пользователей: ID, имя пользователя, ...
  • private_messages: идентификатор, ...
  • private_messages_users: идентификатор , private_message_id, sender_id, recipient_id, статус

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

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

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

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

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

+1

Я не понимаю, на ваш вопрос. Ваш подход выглядит хорошо с высокого уровня (хотя я бы не стал называть вашу таблицу private_messages, поскольку это могло бы создать проблемы для программиста, подобного мне (я избегаю подчеркивания в названии b/c cake sorta имеет зарезервированное для метазначения) – 2010-12-09 19:47:01

+0

I хотел бы предложить предложение относительно ассоциаций между тремя моделями для того, чтобы эти условия имели место. – linkyndy 2010-12-09 20:19:53

ответ

0

Я бы предположил, что вы хотите установить такую ​​установку: 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 talks about this, в частности опция with для отношений.