Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Relations \ BelongsToMany :: routeNotificationFor () - PullRequest
1 голос
/ 27 февраля 2020

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

MessageNotification. php

class MessageNotification extends Notification
{
    use Queueable;

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['database'];
    }

    public function toArray($notifiable)
    {
        return [
            'data' => 'Messenger notification'
        ];
    }
}

InboxController

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

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

    $users = $conversation->participants();

    //dd($conversationUserIds);

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

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

    return new MessageResource($message);
}

Ошибка

Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Relations \ BelongsToMany :: routeNotificationFor ()

Дополнительная информация

I Пришлось создать собственную черту Уведомляемость из-за необходимости использовать как Laravel Система уведомлений Sparks, так и систему уведомлений о запасах Laravels. Учебное пособие Я получил код.

Пользовательская черта уведомления

namespace App\Traits;

use Illuminate\Notifications\Notifiable as BaseNotifiable;
use App\Notifications\DatabaseNotification;

trait Notifiable {

    use BaseNotifiable;

    public function notifications() {
        return $this->morphMany(DatabaseNotification::class, 'notifiable')->orderBy('created_at', 'desc');
    }

}

Также обратите внимание, что $reciever->notify(new MessageNotification()); прекрасно работает при отправке уведомления на один пользователь. Единственное другое решение, которое я видел в этом, было: https://laracasts.com/discuss/channels/code-review/call-to-undefined-method-routenotificationfor-while-sending-email-to-multiple-users

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

1 Ответ

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

Эта строка здесь:

$users = $conversation->participants();

Устанавливает переменную $users для экземпляра QueryBuilder (при условии, что вы используете обычные отношения Laravel), а не для коллекции пользователи. Это связано с тем, что () в конце отношения создает запрос, но еще не запускает его. Итак, когда вы звоните Notification::send($users, etc...), вы не передаете набор пользователей; вы передаете объект QueryBuilder.

Попробуйте вместо этого:

$users = $conversation->participants;

Опять же - это предполагает, что метод участников в модели беседы является стандартным отношением laravel.

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