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