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
}
}
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
}
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
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();
}
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.