Solución:
Creo que puede mantener su estructura de tabla actual para el contenido del mensaje. En lugar de agregar columnas separadas o banderas eliminadas, sería mejor tener una tabla separada para los buzones de correo.
Entonces, su tabla actual de mbox:
id message sentby sentto created
Luego otra tabla para user_mailboxes
id user mailbox message_id
Tendría que hacer tres inserciones en total al escribir un mensaje, una en la tabla de mensajes, para cada usuario en la tabla user_mailboxes.
Entonces, sus datos de mbox se ven así:
id message sentby sentto created
1 Hi There UserA UserB 2015-01-26
2 Hello Back UserB UserA 2015-01-26
Y los datos de user_mailboxes se verían así:
id user mailbox message_id
1 UserA Out 1
2 UserB In 1
3 UserB Out 2
4 UserA In 2
Esto le permite eliminar filas individuales para la tabla user_mailboxes. Esto también permitiría futuros complementos al permitirle enviar mensajes a múltiples usuarios al mismo tiempo (una nueva fila para cada usuario), y permitirle agregar más de un buzón si es necesario (Entrada, Salida, Papelera, Importante , etc.).
Para buscar el correo de un usuario para un buzón en particular, solo debe usar una combinación
SELECT * FROM user_mailboxes LEFT JOIN mbox ON mbox.id = user_mailboxes.message_id WHERE user_mailboxes.user = "$user" AND user_mailboxes.mailbox = "Out";
Necesitaría una secuencia de comandos de limpieza al eliminar para asegurarse de que no haya mensajes huérfanos que no existan en la tabla user_mailboxes.
Solo haga una cosa, agregue dos campos nuevos en su tabla existente
- is_sender_deleted
- is_receiver_deleted
Si alguien lo elimina de la bandeja de salida, establezca el valor de is_sender_deleted en 1. Entonces, cuando muestre datos en la bandeja de salida, simplemente enumere todos los registros cuyo campo is_sender_deleted tiene el valor 0.
La misma situación si alguien lo borra de la bandeja de entrada y luego crea el valor is_receiver_deleted 1. Entonces, cuando muestra los datos en la bandeja de entrada, simplemente enumera todos los registros cuyo valor is_receiver_deleted es 0.
Espero que esta solución te ayude.
También resolví esta tarea. Creo que una tabla no es útil en este caso. Entonces, sugiero usar 2 tablas:
CREATE TABLE `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`subject` varchar(255) NOT NULL,
`body` text NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `message_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`message_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`interlocutor` int(11) DEFAULT NULL,
`folder` enum('inbox','sent') NOT NULL,
`starmark` tinyint(1) NOT NULL DEFAULT '0',
`unread` tinyint(1) NOT NULL DEFAULT '1',
`deleted` enum('none','trash','deleted') NOT NULL DEFAULT 'none',
PRIMARY KEY (`id`),
CONSTRAINT `message_user_user_fk_1` FOREIGN KEY (`message_id`) REFERENCES `message` (`id`) ON UPDATE CASCADE,
CONSTRAINT `message_user_user_fk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON UPDATE CASCADE,
CONSTRAINT `message_user_user_fk_3` FOREIGN KEY (`interlocutor`) REFERENCES `user` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Creo que puede solucionar todos sus problemas, porque los usuarios de mensajes se separaron unos de otros
Entonces, para un mensaje debemos crear 3 inserciones como esta:
public static function createMessage($subject, $body, $source, $sender_id, $receiver_id)
{
// save DATA to message table ($subject, $body, $source)
// save DATA to message_user table ($message_id, $sender_id, $receiver_id, 'sent')
// save DATA to message_user table ($message_id, $receiver_id, $sender_id, 'inbox')
}
En este caso, para cada usuario creamos filas separadas en la tabla. message_user
. Entonces, cuando user_1 elimina un mensaje en esta carpeta de la bandeja de entrada, lo marcamos como ‘eliminado’ y no tiene ningún efecto en el segundo usuario.
Entonces, para obtener todos los mensajes de usuario, debemos ejecutar solo SELECT simple como este:
SELECT *
FROM message m
JOIN message_user mu
ON m.id = mu.message_id
WHERE mu.deleted = 'none'
AND mu.user_id = :user_id