Получить получателей, где не user () -> auth () во многих ко многим - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть система сообщений, в которой в разговоре много сообщений. В разговоре также много получателей (пользователей). Что я пытаюсь сделать, это отправить уведомление всем пользователям, кроме аутентифицированного пользователя, который отправляет / отвечает на сообщения сообщений.

Таблицы (для тех, кому это помогает)

Таблица беседы

$table->bigIncrements('id');
$table->string('hashed_id')->nullable();
$table->unsignedInteger('has_reply')->unsigned()->default(0);
$table->text('subject');
$table->timestamps();

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

$table->bigIncrements('id');
$table->unsignedBigInteger('sender_id');
$table->unsignedBigInteger('conversation_id');
$table->text('body');
$table->timestamps();

$table->foreign('sender_id')->references('id')->on('users');
$table->foreign('conversation_id')->references('id')->on('conversations');

таблица разговора-участника

$table->integer('user_id')->unsigned();
$table->integer('conversation_id')->unsigned();
$table->tinyInteger('status')->default(1);
$table->tinyInteger('is_sender')->default(0);
$table->timestamps();

$table->foreign('conversation_id')->references('id')->on('conversations')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

Метод контроллера

InboxController

public function reply($hashedId, Request $request)
{
    $this->validate($request, [
        'body' => 'required',
    ]);

    $conversation = Conversation::where('hashed_id', $hashedId)->first();

    //Recipients that aren't auth
    $users = $conversation->recipients;

    $notifications = Notification::send($users, new MessageNotification());

    $message = $conversation->messages()->create([
        'sender_id' => auth()->user()->id,
        'body' => $request->body,
    ]);

    return new MessageResource($message);
}

Отношения

Модель разговора (проблемный c код)

public function recipients()
{
  return $this->belongsToMany('App\User' ,'conversation_participants','conversation_id','user_id')->wherePivot('user_id',0);
}

Что мне интересно, так это получить recipients(), которые не auth()->user()->id, но не похоже, что есть способ сделать что-то вроде whereNotInPivot(), поддерживая коллекцию, которая мне нужна уведомить всех пользователей.

1 Ответ

0 голосов
/ 27 февраля 2020

Контроллер

public function reply($hashedId, Request $request)
{
    $this->validate($request, [
        'body' => 'required',
    ]);

    $conversation = Conversation::where('hashed_id', $hashedId)->first();

    //Recipients that aren't auth
    $users = $conversation->recipients()->where('users.id', '!=', auth()->id())->get();

    $notifications = Notification::send($users, new MessageNotification());

    $message = $conversation->messages()->create([
        'sender_id' => auth()->user()->id,
        'body' => $request->body,
    ]);

    return new MessageResource($message);
}
...