Как сохранить и обновить одну запись пользователя в полиморфной модели

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

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

Первая попытка:

if (auth()->user()) {
        if (auth()->user()->visits()->first())
        {
            auth()->user()->visits()->where('user_id', auth()->id())->update([
                'user_id' => auth()->id(),
                'visitable_id' => $user->id,
                'visitable_type' => get_class($user)
            ]);
        } elseif (empty(auth()->user()->visits()->first()))
        {
            auth()->user()->visits()->create([
                'user_id' => auth()->id(),
                'visitable_id' => $user->id,
                'visitable_type' => get_class($user)
            ]);
        }
    }

Вторая попытка:

    if (auth()->user()) {
        auth()->user()->visits()->where('user_id', auth()->id())->updateOrCreate([
            'visitable_id' => $user->id,
            'visitable_type' => get_class($user)
        ]);
    }

Итак, чего я хочу добиться, так это: я хочу, чтобы ОДНА запись для каждого пользователя, а visitable_id и visitable_type обновлялись при посещении каждого маршрута. Кажется, я не могу заставить это работать, он всегда создает новые или не создает их, потому что у него нет «отправной точки».

Кто-нибудь может мне помочь, пожалуйста! Спасибо!!

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

Tpojka 21.12.2020 03:25

Теперь я пытаюсь удалить записи, связанные с пользователем, перед вставкой, но они не удаляются.

user123 21.12.2020 03:56
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout.
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для...
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Как получить URL-адрес реферера в PHP и Laravel?
Как получить URL-адрес реферера в PHP и Laravel?
Когда пользователи посещают ваш сайт, бывает полезно знать, откуда они пришли. URL-адрес реферера предоставляет информацию о странице, на которой...
Привязка маршрутной модели в Laravel
Привязка маршрутной модели в Laravel
Laravel - один из самых популярных на сегодняшний день PHP-фреймворков. Одной из его многочисленных функций является Route Model Binding, которая...
1
2
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я буду считать, что ваши отношения правильные.

Вы используете updateOrCreate неправильно, вам не нужно условие where.

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

Ваш код будет выглядеть так:

     if (auth()->user()) {
            auth()->user()->visits()->updateOrCreate(
             [
               'user_id' => auth()->id(),
             ],
             [
                'visitable_id' => $user->id,
                'visitable_type' => get_class($user)
            ]);
        }
Ответ принят как подходящий

Итак, сначала просто удалите запись, которая есть, вызвав модель Visit::where('user_id', auth()->id())->delete(), чтобы очистить существующую активность пользователя, а затем вставьте новую запись: ).

Другие вопросы по теме