Autour de Laravel

Accessor dans une relation manyToMany

Avatar de Jean-marcStrauven
Jean-marcStrauven

Bonjour, J'ai une relation ManyToMany et j'ai selectionner les champs que je veux afficher via le pivot comme ceci :

public function teams()
{
    return $this->belongsToMany(Team::class)
        ->select(['teams.id', 'name', 'status', 'role', 'subscription']);
}

Et cela fonctionne bien, j'ai bien en retour la liste des membres et des teams dans lequels ils sont inscrits avec les 5 champs que j'ai selectionnés. Maintenant, "status" et "role" sont en fait des ENUM en PHP :

<?php

namespace App\Enums;

enum TeamStatus: int
{
case Enabled    = 1;
case Disabled   = 2;
case Deleted    = 3;
}

Je me demande comment puis-je faire un accessor ou autre chose pour, ne plus afficher l'id (sauver en DB) mais le nom de l'Enum aquivalent à l'ID ?

Je connais la fonction pour allez chercher son nom mais pas comment l'intègrer dans un accessor dans le cas d'un ManyToMany.

TeamStatus::from(request('role'))->name;

Merci

Posté il y a 4 mois
Avatar de khalyomede
khalyomede

Bonjour, est-ce que tu as essayé de préciser la façon dont ton modèle doit caster la colonne en passant par la propriété $casts ? C'est documenté ici : https://laravel.com/docs/9.x/eloquent-mutators#enum-casting

Si je ne me trompe pas ça devrait donner quelque chose comme ça :

namespace App\Models;

use App\Enums\TeamStatus;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Team extends Model
{
  use HasFactory;

  protected $casts = [
    "role" => TeamStatus::class,
  ];

  // ...
}
Posté il y a 3 mois

Vous ne pouvez pas répondre à ce sujet.