Besoin d'aide ?

Relation polymorphique - Attach/Detach/Sync avec champ supplémentaire

  • Avatar de PLJerem
    Membre depuis :
    10/01/2019
    Messages :
    23

    Bonjour,

    J'ai plusieurs tables :

    • utilisateur
      • id
      • nom
    • equipes
      • id
      • equipe
    • groupes
      • id
      • groupe
    • activites_groupes
      • id
      • activite_id
      • groupe_id
    • activites
      • id
      • activite
    • executant
      • id
      • activite_id
      • attach_type
      • attach_id
      • groupe_id

    Des activités peuvent être exécutées soit par des utilisateurs, soit par des équipes. J'utilise la relation polymorphique "executant" pour effectuer ces relations.

    Des activités peuvent être regroupées dans des groupes. La table pivot "activites_groupes" permet d'effectuer ces relations.

    Dans l'administration d'un groupe d'activités, le but est de pouvoir lier toutes les activités du groupe à une/des équipes, un/des utilisateurs.

    Vu qu'au final lier des activités rattachées à un groupe ou lier des activités directement à des utilisateurs ou des équipes est identique, je souhaite que tout soit centralisé dans la table "executant". Pour faire le distingo, lorsque qu'une activité est liée par l'intermédiaire d'un groupe j'ai rajouté le champ "groupe_id" dans la table pour le modéliser. Ce champ est à "NULL" si l'activité n'est pas liée par l'intermédiaire d'un groupe.

    J'ai réussi à tout coder pour lier directement une activité aux utilisateurs/equipes.

    Dans mon GroupeController, tout est OK lorsque je créé un nouveau groupe :

    public function store(Request $request) {
    $request->validate([
    // Validation des données du formulaire
    'groupe' => 'bail|string|max:40|unique:groupes,groupe|required',
    'activites' => 'bail|array|nullable',
    'utilisateurs' => 'bail|array|nullable',
    'equipes' => 'bail|array|nullable'
    ]);

    // Création du groupe
    $groupe = new Groupe();
    $groupe->groupe = $request->groupe;
    $groupe->save();

    // Ajout des activités liées au groupe
    $groupe->activites()->sync(is_null($request->activites) ? [] :$request->activites );

    // Lien entre les activités et les utilisateurs / équipes
    $attachUtilisateurs=[];
    $attachEquipes=[];
    if (!is_null($request->utilisateurs)) {
    foreach ($request->utilisateur as $utilisateurId) {
    $attachUtilisateurs[$utilisateurId] = ['groupe_id' => $groupe->id];
    }
    }
    if (!is_null($request->equipes)) {
    foreach ($request->equipes as $equipeId) {
    $attachEquipes[$equipeId] = ['groupe_id' => $groupe->id];
    }
    }
    $groupe->activites->each(function ($item) user ($attachEquipes, $attachUtilisateurs) {
    $item->executeUtilisateurs()->attach($attachUtilisateurs);
    $item->executeEquipes()->attach($attachEquipes);
    });
    }

    Je bloque lorsque je veux faire un update du groupe :

    public function update(Request $request, $groupeId) {
    // Récupératon du groupe à éditer
    $groupe = Groupe::findOrFail($groupeId);

    // Validation des données du formulaire
    $request->validate([
    'groupe' => 'bail|string|max:40|required|unique:groupes,groupe,'.$groupe->groupe.,
    'activites' => 'bail|array|nullable',
    'utilisateurs' => 'bail|array|nullable',
    'equipes' => 'bail|array|nullable'
    ]);

    // Ajout des activités liées au groupe
    $groupe->activites()->sync(is_null($request->activites) ? [] :$request->activites );

    // Lien entre les activités et les utilisateurs / équipes
    $attachUtilisateurs=[];
    $attachEquipes=[];
    if (!is_null($request->utilisateurs)) {
    foreach ($request->utilisateur as $utilisateurId) {
    $attachUtilisateurs[$utilisateurId] = ['groupe_id' => $groupe->id];
    }
    }
    if (!is_null($request->equipes)) {
    foreach ($request->equipes as $equipeId) {
    $attachEquipes[$equipeId] = ['groupe_id' => $groupe->id];
    }
    }
    $groupe->activites->each(function ($item) user ($groupe, $attachEquipes, $attachUtilisateurs) {
    $item->executeUtilisateurs()->wherePivot('groupe_id', $groupe->id)->sync(...);
    $item->executeEquipes()->wherePivot('groupe_id', $groupe->id)->sync(...);
    });
    }

    Voilà où j'en suis :( Je suis bloqué sur les sync. Toute aide est la bienvenue :)

  • Avatar de PLJerem
    Membre depuis :
    10/01/2019
    Messages :
    23

    Bon, j'ai peu galéré, je trouve la méthode un peu barbare mais ca fonctionne :

    public function update(Request $request, $groupeId) {
    // Récupératon du groupe à éditer
    $groupe = Groupe::findOrFail($groupeId);

    // Validation des données du formulaire
    $request->validate([
    'groupe' => 'bail|string|max:40|required|unique:groupes,groupe,'.$groupe->groupe.,
    'activites' => 'bail|array|nullable',
    'utilisateurs' => 'bail|array|nullable',
    'equipes' => 'bail|array|nullable'
    ]);

    // Edition du groupe
    $groupe->groupe = $request->groupe;
    $groupe->save();

    // Activités supprimées
    $activitesBefore = $groupe->activites->pluck('id');
    $groupe->activites()->sync($request->activites);
    $groupe = $groupe->fresh('activites');
    $activitesAfter = $groupe->activites->pluck('id');
    $activitesSupprimees = $activitesBefore->diff($activitesAfter);
    Activites::whereIn('id', $activitesSupprimees)->get()->each(function ($item) use ($groupeId) {
    $item->Utilisateurs()->wherePivot('groupe_id', $groupeId)->detach();
    $item->Equipes()->wherePivot('groupe_id', $groupeId)->detach();
    });

    // Update des liens avec les activités
    $equipesSync=[];
    $utilisateursSync=[];
    if (!is_null($request->equipes)) {
    foreach ($request->equipes as $equipeId) {
    $equipesSync[$equipeId] = ['groupe_id' => $groupe->id];
    }
    }
    if (!is_null($request->utilisateurs)) {
    foreach ($request->utilisateurs as $utilisateurId) {
    $utilisateursSync[$utilisateurId] = ['groupe_id' => $groupe->id];
    }
    }
    $groupe->activites->each( function ($item) use ($groupe, $equipesSync, $utilisateursSync) {
    $item->utilisateurs()->sync($utilisateursSync);
    $item->equipes()->sync($equipesSync);
    });

    // Fin du code
    }

    Si vous avez mieux, je suis preneur.

Vous ne pouvez pas répondre à ce sujet.