Autour de Laravel

Gestion favoris avec firstOrCreate

Avatar de StephaneMarry
StephaneMarry

Bonjour tout le monde.

J'ai créer un controller pour gérer des projets à mettre en Favoris. Dans mon controller je crais un "firstOrCreate" qui permet dans une table d'avoir l'id du projet et l'id de l'utilisateur qui à mis en favoris. Par contre j'aimerais savoir si c'est possible avec "firstOrCreate" de pouvoir delete l'element si jamais celui-ci est déjà enregistré.

Merci pour votre aide :)

Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Ben en théorie, oui. S'il est déjà créé, ça rentre dans le first. Mais je ne suis pas certain que ta question soit bonne. Ne veut-tu pas plutôt supprimer un AUTRE élément ? Genre s'il y a déjà un favoris... Dans ce cas, pas le choix, tu dois déjà vérifier s'il existe déjà et le supprimer avant de créer le nouveau je pense.

Enfin ça dépends de comment tu as disposé ta BDD

Avatar de StephaneMarry
StephaneMarry

Salut et merci d'avoir répondu :) En gros j'ai une table Favoris avec id, id_projet,id_user et si quelqu'un met en favoris un projet, j'ajoute dans cette créer dans cette table une nouvelle ligne avec l'id du projet et l'id de l'utilisateur. Et si j'ai déjà mis en favoris le projet, je supprime cette ligne.

Du coup je me demandais si il existait une fonction Laravel pour détecter si la ligne existe déjà et si oui la delete, sinon l'ajouter. J'ai vu dans la DOC la fonction firstOr.

Avatar de StephaneMarry
StephaneMarry

Voilà sur quoi je suis partis du coup. :)


        $id_user = Auth::id();

        if ($request->ajax()) {

            $favori = Favoris::where('projet_id', $id)->where('user_id', $id_user)->firstOrFail();
            if ($favori) {
                Favoris::destroy($favori->id);
            } else {
                Favoris::firstOrCreate(
                    [
                        'projet_id' => $id,
                        'user_id' => $id_user
                    ]
                );
                return 'ok';
            }
        }
        abort(404);
Avatar de KYoann
KYoann

Bonjour,

A première vue cela ressemble à une table de relation.

Dans ce cas il serait plus simple d'utiliser : $user->roles()->attach($roleId);

ne pas oublier de déclarer la relation "favoris" de type manytomany dans les models User et Projet

if ($request->ajax()) {

            $user = user::find($id_user);
            $user->favoris()->attach($id);
            
            return 'ok';
            
        }
        abort(404);

Si jamais tu veux suppimer une relation existante tu peu faire ceci

$user->favoris()->detach();

Vous ne pouvez pas répondre à ce sujet.