Как правильно настроить внутреннюю базу данных сообщений laravel на сайте - PullRequest
0 голосов
/ 25 января 2020

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

1[
Message with sender_id = 1 and sent_to_id = 2 body = text here
Message with sender_id = 2 and sent_to_id = 1 body = text here
Message with sender_id = 1 and sent_to_id = 2 body = text here
]
2[
Message with sender_id = 1 and sent_to_id = 4 body = text here
Message with sender_id = 4 and sent_to_id = 1 body = text here
]
3[
Message with sender_id = 16 and sent_to_id = 1 body = text here
Message with sender_id = 1 and sent_to_id = 16 body = text here
]

Я начал создавать свою базу данных следующим образом

$table->bigIncrements('id');
            $table->unsignedBigInteger('sender_id');
            $table->unsignedBigInteger('sent_to_id');
            $table->text('body');
            $table->timestamps(); 
            $table->foreign('sender_id')
                    ->references('id')->on('users')
                    ->onDelete('cascade');
            $table->foreign('sent_to_id')
                    ->references('id')->on('users')
                    ->onDelete('cascade');

Тогда в моей модели пользователя у меня есть

public function received()
    {
        return $this->hasMany(Message::class, 'sent_to_id');
    }
 public function sent()
    {
        return $this->hasMany(Message::class, 'sender_id');
    }

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

  1. Правильно ли я настроил свою базу данных для того, чего я пытаюсь достичь?

  2. Как настроить ее в моей модели для возврата сообщений сгруппированы по разговорам между пользователями?

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Вы можете создать таблицу conversations с sender_id и recipient_id и отдельной таблицей messages для хранения сообщений, относящихся к этому разговору.

/** Conversations **/
class Conversation extends Model
{

    protected $fillable = ['sender_id', 'sent_to_id'];

    public function messages()
    {
        return $this->hasMany(Message::class);
    }
    ...

/** Messages **/
class Message extends Conversation
{
    protected $fillable = [
        'user_id',// User that created this message
        'message', // Body of the message
        'conversation_id'
    ];

    public function conversation()
    {
        return $this->belongsTo(Conversation::class);
    }
    ...

При вышеописанной настройке вы можно общаться с сообщениями:

/** Currently authenticated user **/
$userId = auth()->id();
$conversations = App\Conversation::where('sender_id', $userId)
    ->orWhere('sent_to_id', $userId)
    ->with('messages')->get();
0 голосов
/ 25 января 2020

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

  • sender_id int
  • receive_id int
  • body varchar (255)
  • create_at datetime
  • seen_at datetime обнуляется
    /** Messages **/
    class Message extends Model
    {
        protected $fillable = [
            'sender_id',
            'receiver_id',
            'body',
            'seen_at',
        ];
    }

и извлекайте его с помощью:

// don't  forget to update seen attribute while fetching
App\Message::where('receiver_id',$userId)->update(['seen_at' => date('Y-m-d H:i:s') ]);
//
$userId = auth::user()->id(); // authenticated_user
$messages = App\Message::where('sender_id', $userId)->orWhere('receiver_id',$userId)->get();

, и вы легко можете нанести на него карту для стилизации (при просмотре)

@foreach($messages as $message)
  @if ($message->sender_id == Auth::user()->id)
    <p class='message_sent'> {{$message->body}} </p>
  @else
    <p class='message_received'> {{$message->body}} </p>
  @endif
 @if ($message->seen_at)
  <p> {{$message->seen_at}} </p>
 @endif
@endforeach
...