it-roy-ru.com

Проверьте, существует ли строка, Laravel

У меня есть следующая структура БД:

items:
id, name, user_id

users table:
id, name

user_favorites table:
id, user_id, item_id

На моих страницах постоянных ссылок товаров есть кнопка «Добавить в избранное», которая вставляет новую строку в user_favorites

Я хочу иметь возможность заменить ее на кнопку «Удалить из избранного», если у пользователя она уже есть в избранном.

Я не могу понять логику, стоящую за этим - нужно ли проверять, существует ли в user_favorites строка, в которой есть идентификатор текущего пользователя и идентификатор постоянной ссылки? Это не сработало для меня:

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
    }
}
19
O P

Вы можете захотеть что-то вроде этого:

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

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

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

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

например.

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

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

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

0
Amit Gupta