Laravel 5

Mise à jour d'une table pivot en gardant les anciennes valeurs

  • Avatar de Bwanophele
    Membre depuis :
    22/05/2019
    Messages :
    1

    Hoy ! Petit soucis dont je n'arrive pas à me défaire, et pourtant j'ai un Bac+4 en google.

    J'ai deux classes : une classe Calendar :

    class Calendar extends Model {

    public function users() {
    return $this->belongsToMany('App\Models\User')->withPivot('display', 'all_rights', 'color', 'rgbCode');
    }
    }

    Et une classe User (étonnament)

    class User extends Model {
    public function calendars() {
    return $this->belongsToMany('App\Models\Calendar')->withPivot('display', 'all_rights', 'color', 'rgbCode');
    }
    }

    Ces deux classes sont liées par une table pivot calendar_user qui a donc les attributs display, all_rights, color et rgbCode.

    Lorsque je créé un calendrier, je peux ainsi ajouter des utilisateurs et leurs attribuer des droits (pour faire ça, j'ai deux select multiple, un pour les admin, et l'autre pour les simples utilisateurs, et ma fonction est ainsi faite : )

    public function create(Request $request)
    {
    $calendar = new Calendar();
    $calendar->name = $request->input('name');
    $calendar->save();
    $calendar->users()->attach($request->input('users'), ['color' => $color->name, 'rgbCode' => $color->rgbCode]);
    $calendar->users()->attach($request->input('administrators'), ['all_rights' => 1,'color' => $color->name, 'rgbCode' => $color->rgbCode]);
    }

    On attribue donc aux utilisateurs normaux une valeur à color et rgbCode, all_rights et display étant set à null, et pour les admins, seul display est à null.

    C'est lors de l'update que le bât blesse :

    public function update(Request $request)
    {
    $calendar = Calendar::find($request->input('id'));
    $calendar->name = $request->input('name');
    $calendar->update();

    $calendar->users()->sync($request->input('users'));
    $calendar->users()->sync($request->input('administrators'), ['all_rights' => 1]);
    }

    Ici, je voudrai simplement que les champs all_rights changent si besoin est. Le soucis, c'est que les valeurs qui ne sont pas censées changer (la couleur et le display, qui du coup sont uniquement du fait de l'utilisateur une fois qu'on lui a attribué le calendrier) se remettent à zéro. Le comportement est normal, mais j'aurai voulu savoir s'il y avait un moyen de récupérer les valeurs déjà dans la table, et si non, en mettre par défaut.

    Je sais que je peux le faire en faisant une fonction assez longue et verbeuse, mais j'aurai bien aimé éviter ça, surtout que je pense que c'est peut-être possible. Si vous avez une petite idée, je la prend avec plaisir, parce que j'ai écumé google jusqu'à la page 7 (c'est vous dire si je suis désespérée). Merci !

Vous ne pouvez pas répondre à ce sujet.