Функция связи сообщений в Laravel

Я создаю систему сообщений, в которой Team может отправить сообщение всем users, а пользователь может отправить сообщение одному конкретному Team.

У меня возникли проблемы с определением отношений между моделями Team, Message, User.

Моя идея заключалась бы в том, чтобы использовать одну и ту же таблицу для отправки сообщений с изменением sender_id и получателя_id в зависимости от того, кто создал сообщение и кто является получателем, чтобы идентификатор мог соответствовать профилю пользователя или идентификатору команды. type определяется либо как broadcast, если это сообщение от команды для всех пользователей, и как contact, если пользователь отправляет сообщение команде таким образом, когда я прихожу к списку сообщений, которые я могу фильтровать по типу и т. д.

Таблица сообщений

Ниже приведены столбцы таблицы, которые я имел в виду для таблицы сообщений:

 Schema::create('messages', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('sender_id');
        $table->integer('recipient_id');
        $table->string('type');
        $table->timestamps();
    });

Поскольку команда может иметь много сообщений и много сообщений и может принадлежать многим командам, я собирался создать новую сводную таблицу с именем team_messages, например

public function up()
{
    Schema::create('team_messages', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('team_id');
        $table->integer('message_id');
    });
}

Отношения внутри модели команды будут следующими:

public function messages()
{
    return $this->belongsToMany('App\Message');
}

Когда дело доходит до отношения пользователя к сообщению, что было бы лучшим вариантом, если бы пользователь мог отправить сообщение и иметь возможность перечислять сообщения, отправленные им из команды?


person Lowtiercoder    schedule 26.02.2021    source источник


Ответы (1)


если вы используете одну и ту же таблицу для обоих типов сообщений, вы можете использовать полиморфизм в красноречии

Schema::create('messages', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('message');
        $table->morphs('sender');
        $table->morphs('recipient');
        $table->timestamps();
    });

это создаст sender_id, sender_type, reciever_id, reciever_type, и вам не нужна сводная таблица

https://laravel.com/docs/8.x/migrations#column-method-morphs

для отношений ты можешь сделать как

в Message.php

public function sender()
{
     return $this->morphTo();
}

public function recipient()
{
     return $this->morphTo();
}

в team.php

 public function sendMessages()
 {
     return $this->morphMany(Message::class, 'sender');
 }

 public function recievedMessages()
 {
     return $this->morphMany(Message::class, 'recipient');
 }

в user.php

 public function sendMessages()
 {
     return $this->morphMany(Message::class, 'sender');
 }

 public function recievedMessages()
 {
     return $this->morphMany(Message::class, 'recipient');
 }

для получения дополнительной информации посетите https://laravel.com/docs/8.x/eloquent-relationships#one-to-many-polymorphic-relations

MessageController.php

function create(){
  //if team was sending
  
   $team->sendMessage()->create([
    
    'message' => "",
    'sender_id => $user->id,
    'sender_type' => base_class($user)

    ])  

}
person DOLWIN DAVIS    schedule 26.02.2021
comment
Спасибо за ответ! поэтому, даже если идентификатор team_id и идентификатор пользователя могут различаться в каждом столбце, будет ли это решение по-прежнему обеспечивать лучший способ создания и извлечения записей сообщений? - person Lowtiercoder; 26.02.2021
comment
например, если вы отправляете сообщение от команды пользователю, оно будет записывать sender_id как team_id и sender_type как модель команды, а для получателя user_id и модель пользователя будут сохранены. поэтому, если вы хотите проверить команду, sendMessages $team-›sendMessages u получит все сообщения, отправленные командой - person DOLWIN DAVIS; 26.02.2021
comment
спасибо, а что, если вы хотите создать сообщение для отправки/сохранения в команде -> пользователя, вы бы сделали $team-›sendMessages()-›create() или это $team-›message()-›create () Я неправильно понимаю? - person Lowtiercoder; 26.02.2021
comment
Как мне создать запись сообщения, отправленную командой пользователю в красноречии? - person Lowtiercoder; 26.02.2021
comment
в той же таблице вы можете создать еще одно сообщение столбца. - person DOLWIN DAVIS; 26.02.2021