Проверьте, существует ли строка, Laravel
У меня есть следующая структура db:
items:
id, name, user_id
users table:
id, name
user_favorites table:
id, user_id, item_id
На моих страницах с постоянными ссылками, у меня есть кнопка "Добавить в избранное", которая вставляет новую строку в user_favorites
Я хочу, чтобы иметь возможность заменить его на кнопку "Удалить из избранного", если пользователь уже имеет его в своих избранных.
Я не могу понять логику этого - нужно ли проверять, существует ли строка в user_favorites
, которая имеет текущий идентификатор пользователя и идентификатор элемента permalink? Это не сработало для меня:
if (Auth::user()->id) {
if (!is_null(DB::table('user_favorites')->where('user_id', '=', Auth::user()->id)->where('item_id', '=', $item->id)->first())) {
// remove from favorites button will show
}
}
Ответы
Ответ 1
Вам может понадобиться что-то вроде этого:
$user_favorites = DB::table('user_favorites')
->where('user_id', '=', Auth::user()->id)
->where('item_id', '=', $item->id)
->first();
if (is_null($user_favorites)) {
// It does not exist - add to favorites button will show
} else {
// It exists - remove from favorites button will show
}
Ответ 2
Советуем использовать exists()
или count()
для проверки, а не для использования first()
.
Самый быстрый способ:
$result = DB::table('user_favorites')
->where('user_id', '=', Auth::user()->id)
->where('item_id', '=', $item->id)
->exists();
Или:
$result = DB::table('user_favorites')
->where('user_id', '=', Auth::user()->id)
->where('item_id', '=', $item->id)
->count();
SQL:
select count(*) as aggregate from `user_favorites` where *** limit 1
Более быстрый способ: выберите только идентификатор
$result = DB::table('user_favorites')
->where('user_id', '=', Auth::user()->id)
->where('item_id', '=', $item->id)
->first(['id']);
SQL:
select id from `user_favorites` where *** limit 1
Обычный способ:
$result = DB::table('user_favorites')
->where('user_id', '=', Auth::user()->id)
->where('item_id', '=', $item->id)
->first();
SQL:
select * from `user_favorites` where *** limit 1
Ответ 3
Пусть User_favorite
- модель, которая обращается к вашей таблице user_favorites
$result = User_favorite::where('user_id',Auth::getUser()->id)
->where('item_id',$item->id)
->first();
if (is_null($result)) {
// Not favorited - add new
User_favorite::create(['user_id'=>Auth::getUser()->id,'item_id'=>$item->id]);
} else {
// Already favorited - delete the existing
$result->delete();
}
Ответ 4
Самый простой способ - использовать toggle()
метод отношения "многие ко многим".
например.
$user->roles()->toggle([1, 2, 3]);
Отношение "многие ко многим" также обеспечивает метод переключения, который "переключает" статус прикрепления данных идентификаторов. Если данный идентификатор в настоящее время прилагается, он будет отсоединен. Аналогично, если в настоящее время отсоединенный, он будет прикреплен
Он также возвращает массив, который сообщает вам, что ID
подключен или отсоединен в БД.