web-dev-qa-db-fra.com

Vérifiez si la ligne existe, Laravel

J'ai la structure de base de données suivante:

items:
id, name, user_id

users table:
id, name

user_favorites table:
id, user_id, item_id

Sur mes pages de liens permanents, j'ai un bouton "Ajouter aux favoris" qui insère une nouvelle ligne dans user_favorites

Je souhaite pouvoir le remplacer par un bouton "Supprimer des favoris" si l'utilisateur l'a déjà dans leurs favoris.

Je ne peux pas comprendre la logique derrière ceci - dois-je vérifier si une ligne existe dans user_favorites qui a l'identifiant de l'utilisateur actuel et l'identifiant de l'élément permalien? Cela n'a pas fonctionné pour moi:

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

Vous voudrez peut-être quelque chose comme ça:

$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

Je vous conseille d'utiliser exists() ou count() pour vérifier, pas pour utiliser first().

Le moyen le plus rapide:

$result = DB::table('user_favorites')
    ->where('user_id', '=', Auth::user()->id)
    ->where('item_id', '=', $item->id)
    ->exists();

Ou:

$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

Le moyen le plus rapide: ne sélectionnez que l'id

$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

La manière normale:

$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

Soit User_favorite un modèle qui accède à votre table 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

Le moyen le plus simple consiste à utiliser toggle() méthode de la relation plusieurs-à-plusieurs.

par exemple.

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

La relation plusieurs à plusieurs fournit également une méthode de basculement qui "bascule" le statut de pièce jointe des identifiants donnés. Si l'ID donné est actuellement attaché, il sera détaché. De même, si c'est actuellement détaché, il sera attaché

Il renvoie également un tableau qui vous indique si la variable ID est attachée ou détachée dans la base de données.

0
Amit Gupta