Pour un système de topics, c'est à dire de fil de discussion tu peux faire comme suit :
Extrait schéma des tables :
users(id, username, ...)
mp_messages(id, subject, content, from_id, to_id, from_status, to_status, parent_id)
from_id & to_id contiennent des id d'user.
from_status & to_status sont le status du topic pour le user correspondant (soit from ou to)
Exemple de contenu de la table mp_messages
1, 'premier mp', 'contenu du premier mp', 1, 2, 'readed', 'unread', null
2, 'premier mp', '1ere reponse au premier mp', 2, 1, null, null, 1
2, 'premier mp', 'Autre réponse possible au premier mp', 1, 2, null, null, 1
Ensuite il faut créer une vue (SQL) pour te simplfier la vie. Tu peux faire sans mais c'est galère je trouve.
CREATE VIEW mp_messages_view as
SELECT
t1.id AS id,
t1.subject AS subject,
t1.content AS content,
t1.from_id AS from_id,
t1.to_id AS to_id
t1.from_status AS from_status
t1.to_status AS to_status
t1.parent_id AS parent_id
FROM
mp_messages t1
UNION
SELECT
t2.id AS id,
t2.subject AS subject,
t2.content AS content,
t2.from_id AS to_id,
t2.to_id AS from_id
t2.from_status AS to_status
t2.to_status AS from_status
t2.parent_id AS parent_id
FROM
mp_messages t2;
');
L'essentiel ici, c'est le UNION : j'ai inversé les champs préfixés from je les ai préfixés à to. Comme ça quand tu fais une requête
SELECT * FROM mp_messages_view where to_id = 1 and parent_id = null
Tu as la liste de tous les messages, que le user soit l'expéditeur ou le receveur dans to_id avec le bon statut dans to_status.
En gros
- pour lister les messages : tu utilises la vue SQL avec les conditions
- to_id = utilisateur connecté
- parent_id => null (pour ne récupérer que les topics)
- quand un utilisateur créé un message, pense à renseigné :
- from_id => id de l'expéditeur
- to_id => id du destinataire
- from_status => statut du message pour l'expéditeur, ici read
- to_status => statut du message pour le destinataire, ici unread
- quand un utilisateur répond à un message, pense à renseigné :
- from_id => id de l'expéditeur
- to_id => id du destinataire
- from_status => statut du message pour l'expéditeur, ici null
- to_status => statut du message pour le destinataire, ici null
- parent_id => id du parent
- IMPORTANT tu dois modifier sur l'entrée du parent les status
- from_status => unread
- to_status => read
Je ne sais pas si c'est claire, dis moi :)