Проверьте, существует ли строка, 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 } } 

Вам может понадобиться что-то вроде этого:

 $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 } 

Я советую вам использовать 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 

Пусть 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(); } 

Самый простой способ – использовать метод toggle() «многие ко многим».

например

 $user->roles()->toggle([1, 2, 3]); 

Отношение «многие ко многим» также предоставляет метод переключения, который «переключает» статус прикрепления данных идентификаторов. Если данный идентификатор подключен, он будет отсоединен. Аналогично, если он в настоящее время отсоединен, он будет прикреплен

Он также возвращает массив, который сообщает вам, прикреплен ли ID или отсоединен в БД.