Я пытаюсь добиться функции, в которой работает как «сеанс», каждый раз, когда пользователь посещает поток, профиль, его запись в этой полиморфной таблице будет обновляться соответствующим образом, а не сохранять каждый раз отдельную запись.
Так что это похоже на ленту активности для отдельного пользователя каждый раз, когда он посещает страницу, чтобы отображать свой статус. Это то, что я пробовал до сих пор, но, похоже, это не работает.
Первая попытка:
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 обновлялись при посещении каждого маршрута. Кажется, я не могу заставить это работать, он всегда создает новые или не создает их, потому что у него нет «отправной точки».
Кто-нибудь может мне помочь, пожалуйста! Спасибо!!
Теперь я пытаюсь удалить записи, связанные с пользователем, перед вставкой, но они не удаляются.
Я буду считать, что ваши отношения правильные.
Вы используете 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(), чтобы очистить существующую активность пользователя, а затем вставьте новую запись: ).
Это никогда не изменится. Каждый пользователь просто создаст запись, и она больше никогда не будет изменена, потому что идентификатор и тип одинаковы.