Laravel 5

Ajout Champ dynamique sur Table Pivot

  • Avatar de LaraSharp
    Membre depuis :
    03/01/2018
    Messages :
    9

    Bonjour,

    Je souhaiterais ajouter un champ dynamique (champ non existant dans la table) sur une table pivot pour pouvoir l'ajouter dans ce style :

    public function roles()
    {
    return $this->belongsToMany('App\Models\Role', 'user_role',
    'user_id' ,'role_id')
    ->withPivot('ChampDynamique')
    }

    J'ai essayé avec en créant un get..Attribute sur le Model pivot user_role sans succès :

    public function getChampDynamiqueAttribute()
    {
    return "Champ Dynamique";
    }

    Quelqu'un sait-il si c'est possible ?

    Fabien
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2418

    Salut,

    J'ai du mal à imaginer une situation où on a besoin de ça...

    Cela étant tu as créé un modèle spécifique pour la table pivot ?

  • Avatar de LaraSharp
    Membre depuis :
    03/01/2018
    Messages :
    9

    La table pivot a plusieurs champs supplémentaires dont service_id :

    user_id
    role_id
    service_id

    J'ai par exemple dans ma table pivot (mysql)
    id | user_id | role_id | service_id
    1 | 2 | 3 | 4
    1 | 2 | 4 | 5

    En fait, j'aurais voulu tout englober dans mon user dès le départ (le modele role du user_role + le modele service du user_role) avant d'envoyer les données à la vue. J'avais pensé à éventuel champ dynamique sur le pivot (si possible) mais s'il y a d'autres solutions, je suis preneur.

    Quand je fais par exemple :
    $user = User::first()->with('roles')

    Je récupère pour chaque user_role :
    le modele role correspondant au pivot
    le pivot->user_id
    le pivot->role_id
    le pivot->service_id

    J'aurais voulu avoir quelque chose comme :
    le modele role correspondant au pivot
    le pivot->user_id
    le pivot->role_id
    le pivot->service_id
    le pivot->modele service correspondant au pivot (si possible de créer un champ dynamique)

    Ou quelque chose comme ça :
    le modele role correspondant au pivot
    le pivot->user_id
    le pivot->role_id
    le pivot->service_id
    le modele service correspondant au pivot

    Le but est vraiment d'avoir toutes les infos avant de les envoyer à la vue pour afficher dans un tableau par exemple

    id | username | role | service
    1 | Fabien | Gestionnaire | Administratif
    1 | Fabien | Administrateur | Informatique

    En mettant directement dans le td (pivot.service.name ou service.name) et pas une methode style getName(pivot.service_id).

    Fabien

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2418

    Si je comprends bien tu as une relation entre le pivot user_role et la table services. Apparemment du genre user_role belongsTo service. Si c'est le cas autant formaliser cette relation et l'utiliser plutôt que de bidouiller le pivot.

  • Avatar de LaraSharp
    Membre depuis :
    03/01/2018
    Messages :
    9

    D'après ce que je comprends à ta proposition, je fais une function Service dans le model pivot UserRole

    Model UserRole :

    public function Service()
    {
    return $this->hasOne('App\Models\Service', 'id', 'service_id');
    }

    Par contre je ne vois pas comment faire pour récupérer le service lié à chaque userrole avec la commande :
    $user = User::first()->with('roles');

    Je me doute qu'il faut rajouter un ->with('Service) quelque part mais mes essais n'ont pas abouti, quelle syntaxe proposes-tu pour faire ça ?

    Fabien

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2418

    Je pense qu'il faut décomposer la relation many to many en deux relations comme j'avais proposé dans cet article. Ici ce n'est pas un many to many qui se greffe mais un simple HasMany mais le principe demeure le même.

  • Avatar de LaraSharp
    Membre depuis :
    03/01/2018
    Messages :
    9

    Je ne suis pas sûr que ça corresponde vraiment à ce que je souhaite, je vais continuer de chercher une solution

Vous ne pouvez pas répondre à ce sujet.