Нет результатов запроса для модели [App \ Models \ Match]

Я создаю API с Laravel и хочу отправлять push-уведомления с помощью системы уведомлений Laravel. У меня есть модель матчей (это в основном пост), этот матч может понравиться другому пользователю. Когда матч понравится, создатель поста получит push-уведомление. Это как Instagram, Facebook и т. Д.

Часто push-уведомление не отправлялось пользователю. Я установил Laravel Horizon, чтобы посмотреть, есть ли ошибки. Иногда уведомление отправлялось, а иногда нет. С теми же данными:

Список Laravel Horizon

Уведомление иногда не выполняется с одними и теми же данными (тот же пользователь, то же совпадение).

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

Illuminate \ Database \ Eloquent \ ModelNotFoundException: нет результатов запроса для модели [App \ Models \ Match] 118 в /home/forge/owgolf.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:312

Я уверен, что совпадение и пользователь существуют в базе данных, я проверил это перед отправкой уведомления. Кто-нибудь знает, что не так? Все, что я смог найти в Интернете, - это то, что люди не сохраняли свою модель перед отправкой уведомления в очередь. Но строка, в которой код отправляет уведомление в очередь, даже не была бы достигнута, если бы модель не существовала. Из-за неявной привязки в маршруте / контроллере.

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

/**
 * Like a match.
 *
 * @param  \App\Models\Match  $match
 * @return \Illuminate\Http\JsonResponse
 */
public function show(Match $match)
{
    $match->like();

    $players = $match->players()->where('user_id', '!=', currentUser()->id)->get();

    foreach ($players as $user) {
        $user->notify(new NewLikeOnPost($match, currentUser()));
    }

    return ok();
}

Уведомление:

<?php

namespace App\Notifications;

use App\Models\Match;
use App\Models\User;
use Illuminate\Bus\Queueable;
use NotificationChannels\Apn\ApnChannel;
use NotificationChannels\Apn\ApnMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;

class NewLikeOnPost extends Notification implements ShouldQueue
{
    use Queueable;

    /**
     * The match instance.
     *
     * @var \App\Models\Match
     */
    private $match;

    /**
     * The user instance.
     *
     * @var \App\Models\User
     */
    private $user;

    /**
     * Create a new notification instance.
     *
     * @param  \App\Models\Match  $match
     * @param  \App\Models\User  $user
     */
    public function __construct(Match $match, User $user)
    {
        $this->user = $user;
        $this->match = $match;

        $this->onQueue('high');
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  \App\Models\User  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        if ($notifiable->wantsPushNotification($this)) {
            return ['database', ApnChannel::class];
        }

        return ['database'];
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  \App\Models\User  $notifiable
     * @return \NotificationChannels\Apn\ApnMessage
     */
    public function toApn($notifiable)
    {
        return ApnMessage::create()
            ->badge($notifiable->unreadNotifications()->count())
            ->sound('success')
            ->body($this->user->username . ' flagged your match.');
    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            'user_id' => $this->user->id,
            'body' => "<flag>Flagged</flag> your match.",
            'link' => route('matches.show', $this->match),
            'match_id' => $this->match->id,
        ];
    }

    /**
     * Get the match attribute.
     *
     * @return \App\Models\Match
     */
    public function getMatch()
    {
        return $this->match;
    }
}

person Dees Oomens    schedule 05.10.2017    source источник
comment
Покажите код файла уведомления.   -  person Vikash    schedule 05.10.2017
comment
Добавлен код класса уведомлений NewLikeOnPost.   -  person Dees Oomens    schedule 05.10.2017
comment
Я не уверен, но где бы вы ни пытались получить доступ к данным сеанса внутри своих заданий, или любая функция или объект, который вы обрабатываете в очереди, использует сеанс?   -  person Vikash    schedule 05.10.2017
comment
@DeesOomens Можете ли вы добавить код файла, который запускает уведомления?   -  person Charlie Sheather    schedule 05.10.2017
comment
@CharlieSheather Я обновил свой вопрос.   -  person Dees Oomens    schedule 05.10.2017
comment
вы использовали firstorFail() в like () ??   -  person Mr. Pyramid    schedule 29.10.2017
comment
В принципе, я бы старался не ставить модели к вам в очередь. Помимо чистого размера элементов очереди, модели могут изменяться до тех пор, пока задание не будет обработано. Также для отладки я бы попытался передать в ваше уведомление только идентификаторы и сделать свежий findOrFail(), начиная обрабатывать ваш элемент очереди. Возможно, это уже дает вам дополнительную информацию о том, что здесь происходит   -  person patriziotomato    schedule 24.01.2018
comment
@DeesOomens Я столкнулся с той же проблемой. По какой-то причине это происходит только с одним классом уведомлений. Удалось ли вам найти решение?   -  person qasimalbaqali    schedule 21.06.2018
comment
@qasimalbaqali Можете ли вы предоставить трассировку стека?   -  person Jonas Staudenmeir    schedule 22.06.2018
comment
@JonasStaudenmeir Вот и все, pastebin.com/sExrkvj1   -  person qasimalbaqali    schedule 23.06.2018
comment
@qasimalbaqali Используете ли вы транзакции базы данных в том месте, где вы запускаете уведомление?   -  person Jonas Staudenmeir    schedule 23.06.2018
comment
@JonasStaudenmeir нет, я не знаю. Я отправляю это уведомление после создания модели пользователя User::create(), и я уведомляю этот экземпляр пользователя.   -  person qasimalbaqali    schedule 23.06.2018
comment
@qasimalbaqali Вы используете несколько баз данных? Вы пробовали отладку в SerializesAndRestoresModelIdentifiers::getRestoredPropertyValue()? Вы можете проверить содержимое таблицы users, чтобы, возможно, сузить проблему.   -  person Jonas Staudenmeir    schedule 24.06.2018
comment
Нет, я не использую несколько баз данных. Это единая база данных, и пользователь успешно создан, проверен в базе данных, и перед вызовом уведомления я создаю другие экземпляры модели, используя экземпляр пользователя, который вообще не возвращает никаких ошибок.   -  person qasimalbaqali    schedule 24.06.2018
comment
Я думаю, что у вас дублирование работы, проверяйте вакансии, чтобы избежать дублирования   -  person Payam Khaninejad    schedule 26.06.2018
comment
возможно, что вы столкнулись с блокировкой строки postgresql независимо от причины (в основном, чрезмерное использование метода currentUser ()). проверьте этот пост, это может вам помочь: stackoverflow.com/questions/1063043/   -  person N69S    schedule 28.06.2018
comment
У меня такая же проблема, но только на производстве. Локально все работает как положено. Есть ли успехи?   -  person Grant    schedule 10.08.2018
comment
Это было связано с несколькими средами на одних и тех же серверах с использованием одной и той же системы очередей. События / задания для постановки выполнялись в производственной очереди.   -  person Dees Oomens    schedule 15.08.2018


Ответы (2)


Вероятно, потому что $ user не является объектом модели User, это объект модели Match. Вам нужно выполнить User :: findorfail или User :: firstOrFail, а затем уведомить пользователя.

public function show(Match $match)
{
$match->like();

$players = $match->players()->where('user_id', '!=', currentUser()->id)->get();

foreach ($players as $user) {
    $someUser = User::findOrFail($user->user_id);
    $someUser->notify(new NewLikeOnPost($match, currentUser()));
}

return ok();

}

Если в модели Match не используется свойство notify. Или вы можете использовать активную загрузку, которая будет стоить намного меньше запросов!

person Kneegrows    schedule 10.03.2019

Проверьте свой .env, чтобы убедиться, что вы действительно используете REDIS

BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
QUEUE_DRIVER=redis

затем очистите кеш (php artisan cache:clear , php artisan view:clear), это должно устранить проблему

РЕДАКТИРОВАТЬ

У меня были аналогичные проблемы, но теперь я использую только Docker, и до того, как мне пришлось проверять кешированные файлы конфигурации, неправильные права доступа к файлам / папкам и т. Д. (REDIS только для трансляции, другие были стандартными). Я начал использовать только Redis - это намного проще, быстрее и удобнее для отладки! И вместе с Docker действительно полезно не использовать испорченный nginx / apache / php / redis / ...

person BitBay    schedule 22.02.2018
comment
Не исправил :( - person qasimalbaqali; 21.06.2018
comment
это не ответ - person Supun Praneeth; 23.06.2018