如何在聊天应用程序Laravel中区分发送者和接收者?

时间:2018-09-27 21:37:39

标签: database laravel-5 eloquent chat

我正在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

请给我建议一个更好的解决方案。

1 个答案:

答案 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