Laravel 7.0版,MySQL 5.8版
我要为实时聊天系统设计数据库。 这是相关的模型和表格。
User
模型-users
表(id, name, email, address..
)
Guest
模型-guests
表(id, name, ipAddress
)
Team
模型-teams
表(id, name, image
)
team_has_users
(id, team_id, user_id
)
用户应该能够向User
,Team
,Guest
发送消息。
以下是我可能想到的情况。
messsages
表(id, content, from_id, to_id, from_model, to_model
)//我认为这不足以为每个用户保存read_status。
messages
表(id, content
)
message_from_to
表(id, message_id, from_id, to_id, read_status
)
from_id
将是id
表或users
表中的guests
。
但是to_id
和read
的状态对我来说有点棘手。
有人可以帮助我吗?
谢谢
答案 0 :(得分:1)
模型User
,Guest
和Team
看起来也不错。
但是,如果您要跟踪用户为什么看到Message
,则需要对其进行跟踪。
为此,message_from_to
需要一个team_id:
$table->integer('team_id')->nullable();
如果是定向消息或包含Team
id,则将为null。
PS:您仍然需要from_model
和to_model
到message_from_to
中,或者知道它是用于User
还是Guest
。
这是数据库结构上的一个更好的版本:
users
id
name
email
...
guests
id
name
ipAdress
teams
id
name
(https://laravel.com/docs/7.x/eloquent-relationships#many-to-many)
team_user
id_team
id_user
(https://laravel.com/docs/7.x/eloquent-relationships#one-to-many)
messages
id
content
from_id
from_type
team_id [nullable]
(https://laravel.com/docs/7.x/eloquent-relationships#one-to-many-inverse)
message_to
id
id_message
to_id
to_type
read_status
User
和Guest
应该实现相同的类。
雄辩地,您可以做到:
$user->messages(); // return all message
$message->from(); // return User or Guest instance
$message->to(); // return User & Guest array
$message->isRead(Guest|User); // retourn boolean
$message->hasTeam(); // retourn boolean