Laravel: создаю мою собственную систему разговоров - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь создать простую систему разговоров для своего приложения, но у меня есть некоторые проблемы с планированием этой структуры.Когда пользователь переходит на страницу «беседы», он должен перечислять все беседы, в которых пользователь был отправителем или получателем, в порядке последних сообщений.Затем, когда пользователь открывает конкретную беседу, он должен перечислить все сообщения от этой беседы.Я планировал что-то подобное:

  1. Создать таблицу разговоров

            $table->increments('id');            
            $table->integer('sender_id');
            $table->integer('receiver_id');
            $table->timestamps();
    
  2. Создать таблицу сообщений

            $table->increments('id');
            $table->text('message');
            $table->integer('conversation_id');
            $table->integer('user_id');
            $table->timestamps();
    
  3. Создать модель диалога и сообщения

  4. Модель пользователя -?

    public function conversations()
    {
        return $this->hasMany('App\Conversation', 'sender_id');
    }
    

Здесь у меня проблемы - я хочу установить связьс разговорами, где внешний ключ будет 'sender_id' или 'receive_id' и возвращать порядок разговора по самым новым сообщениям.Как я могу это сделать?Можете ли вы дать мне несколько советов, как решить отношения между пользователями, разговорами и сообщениями, чтобы вернуть всю информацию, когда я вернусь к пользователю?

Я действительно ценю любую помощь.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Прежде всего, вы должны определить отношение Диалог с такими сообщениями:

Модель разговора

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

Вы должны также определить обратную зависимость:

Модель сообщения

public function conversation()
{
  return $this->belongsTo('App\Conversation');
} 

Вы можете показать все разговоры пользователя с кодом ниже:

public function getConversations($userId)
{
  $conversations = Conversation::where('sender_id',$userId)->orWhere('receiver_id',$userId);
  return view('yourview', compact('conversations'));
}

По вашему мнению, вы можете зацикливаться и находить каждое сообщение из каждого разговора:

@foreach($conversations as $conversation)
 @foreach($conversation->messages as $message)
  {{$message->message}}
 @endforeach
@endforeach

В вашей таблице conversations может быть user_id FK, также ваши отношения должны выглядеть следующим образом:

Модель пользователя

public function conversations()
{
    return $this->hasMany('App\Conversation', 'user_id');
}

Примечание: вы также можете использовать receiver_id или sender_id в качестве внешнего ключа.

С этим отношением вы можете получить все разговоры от пользователя с этим:

$user = User::find($id);
$user->conversations; // This will return all conversations from that user

Вы также можете получить все сообщения от пользователя, используя отношение Имеет много через :

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


Другой подход

Еще один способ сделать это - создать сводную таблицу между users и conversations

.

Таблица conversation_user

id 
user_id 
conversation_id

Таким образом, у пользователя может быть много разговоров ( Отношение много ко многим ).

Вы можете изменить таблицу messages на:

id
conversation_id
receiver_id
sender_id
content 
...

Ваше Сообщение Модель

public function conversation()
{
 return $this->belongsTo('App\Conversation', 'conversation_id');
}

Модель пользователя

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

The Диалог Модель

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

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

Я думаю, что это лучший способ сделать это

Если вы хотите получить разговор и сообщения:

$user = User::find($id);
foreach($user->conversations as $conversation)
{
 foreach($conversation->messages as $message)
 {
   echo $message->content;
 }
}

Еще один простой способ сделать это - использовать модель сообщения:

$userMessages = Message::where('receiver_id', $userId)->orWhere('sender_id',$userId)->get();

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

foreach($userMessages->conversation as $conversation)
{
 echo $conversation;
}
0 голосов
/ 08 марта 2019

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

Таким образом, у вас должна быть таблица разговоров только с одним предметом. У вас должна быть таблица участников, чтобы вы могли добавлять пользователей в эту часть разговора. и, наконец, таблица сообщений, в которую необходимо сохранять каждое сообщение, которое пользователь отправляет в разговор.

для таблицы потоков:

Schema::create('conversations', function (Blueprint $table) {
    $table->increments('id');
    $table->string('subject');
    $table->timestamps();
});

для таблицы сообщений:

Schema::create('messages', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('conversation_id')->unsigned();
    $table->integer('user_id')->unsigned();
    $table->text('body');
    $table->timestamps();
});

для любого пользователя, который участвует в сообщении:

Schema::create('participants', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('conversation_id')->unsigned();
    $table->integer('user_id')->unsigned();
    $table->timestamp('last_read')->nullable();
    $table->timestamps();
});

Модель пользователя:

public function conversations()
{
    return $this->belongsToMany('App\Conversation', 'user_id');
}

Модель разговора:

public function messages()
{
    return $this->belongsToMany('App\User', 'conversation_id');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...