我正在Laravel 5.7中制作一个私人(一对一)聊天应用程序。 我认为问题在于模式。如果 user1 已登录,并且他与 user2 建立了新对话。这将使用 conversation_id = 1 创建。 下次登录 user2 时,假设他将在发件人列中找到他的 ID ,而在sender_column中将找不到他的 ID ,将创建不应创建的新对话,因为要创建新对话,我们必须在发件人和收件人列中都进行检入。
这是我的模式
=======User Table========
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
=============Chat Table=============
Schema::create('chats', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user1_id')->nullable();
$table->foreign('user1_id')->references('id')->on('users');
$table->unsignedInteger('user2_id')->nullable();
$table->foreign('user2_id')->references('id')->on('users');
$table->timestamps();
});
===============Messages Table================
Schema::create('messages', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('chat_id')->nullable();
$table->foreign('chat_id')->references('id')->on('chats');
$table->text('messages');
$table->timestamps();
});
也许您对此有所了解。
Users Chats
id name chat_id user1_id user2_id
1 Mark 1 1 2
2 David 2 2 1
3 Henzard 3 2 3
4 3 2
请给我建议一个更好的解决方案。
答案 0 :(得分:0)
我可能忽略了该模式的一个或多个复杂性,但是我提出了以下建议。
用户- 保留您现有的用户表。
对话- 这将代表一个对话,发起用户以及对话开始的日期。
- id
- user_id # user who initiated conversation
- created_at
对话用户- 这将代表参与对话的每个用户。尽管您的要求指出每个对话都在两个用户之间,但是这种结构还可以让您将来也可以进行小组对话-如果需要的话。
(可选)您可以添加read_at
时间戳以存储用户上次阅读对话的日期/时间。然后可以用来推断用户在对话中是否有未读消息。
- id
- conversation_id
- user_id
- read_at # when user last read conversation
- created_at
消息-
这将代表对话中的一条消息。由于conversation_user
表决定了可以阅读邮件的用户,因此只需要记录发送用户。
- id
- conversation_id
- user_id # user who sent message
- message
- created_at
- updated_at