Laravel France

API Rest relations non prises en charge

Avatar de AlainArsane
AlainArsane

Bonjour, Si l'on en croit la documentation 6.x la méthode toJson() incorpore les relations d'un modèle et ce n'est pas le cas pour moi. Voici mon contexte : La classe Employee :

class Employee extends Model
{
    protected $table = 'employee';
    public $timestamps = false;
    protected $primaryKey = 'employee_id';
    protected $fillable = ['employee_id', 'name', 'job_id', 'manager_id', 'hiredate', 'salary', 'department_id',];
    
    public function department()
    {
        return $this->belongsTo('App\Models\Department', 'department_id', 'department_id');
    }
}

Pour faire court, je n'ai pas mis les relation Job et Manager La classe Department :

class Department extends Model
{
    protected $table = 'department';
    public $timestamps = false;
    protected $primaryKey = 'department_id';
    protected $fillable = ['department_id', 'dname', 'location'];
    public function employees (){
        return $this->hasMany('App\Models\Employee', 'department_id', 'department_id');
    }    
}

Le contrôleur EmployeeController :

class EmployeeController extends Controller
{
    public function getEmployees(){
        $employees = Employee::all();
        return $employees->toJson(JSON_PRETTY_PRINT);
    }
    
    public function getEmployee($id){
        $employee = Employee::find($id);
        return $employee->toJson(JSON_PRETTY_PRINT);
    }
}

L'appel à l'URL : http://localhost/employeeAPI/public/employees

[ { "employee_id": 1, "name": "KING", "job_id": 1, "manager_id": null, "hiredate": "1981-11-17", "salary": "5000.00", "department_id": 1 }, { "employee_id": 2, "name": "JONES", "job_id": 2, "manager_id": 1, "hiredate": "1981-04-02", "salary": "2975.00", "department_id": 3 }, ... Et normalement je devrais avoir ceci : [ { "employee_id": 1, "name": "KING", "job_id": 1, "manager_id": null, "hiredate": "1981-11-17", "salary": "5000.00", "department_id": 1, "department": { "department_id": 1, "dname": "Accounting", "location": "NEW YORK" }, "job": { "job_id": 1, "jobname": "President" }, "manager": null }, { "employee_id": 2, "name": "JONES", "job_id": 2, "manager_id": 1, "hiredate": "1981-04-02", "salary": "2975.00", "department_id": 3, "department": { "department_id": 3, "dname": "Sales", "location": "CHICAGO" }, "job": { "job_id": 2, "jobname": "Manager" }, "manager": { "employee_id": 1, "name": "KING", "job_id": 1, "manager_id": null, "hiredate": "1981-11-17", "salary": "5000.00", "department_id": 1, "department": { "department_id": 1, "dname": "Accounting", "location": "NEW YORK" }, "job": { "job_id": 1, "jobname": "President" }, "manager": null } }, ... J'ai obtenu ce résultat en surchargeant la méthode toArray() qui est appelée par toJson(), mais ce n'est pas satisfaisant. Quelqu'un pourrait-il me dire où se situe mon erreur ? Merci d'avance.

Posté il y a 8 mois
Avatar de Dom
Dom

Où as tu vu dans la documentation que toutes les relations étaient chargées automatiquement ?

Dans la doc il est écrit je crois que les relations qui sont chargées, sont automatiquement transformées en JSON.

De plus, il y a pas des soucis avec le nom de tes clés primaires ? Elles s'appellent toutes department_id ?

Posté il y a 8 mois
Avatar de stockhausen
stockhausen

Employee::with('department')->whereId($id)->first();

Posté il y a 8 mois
Avatar de AlainArsane
AlainArsane

Bonjour, Tout fonctionne bien maintenant pour cela il a fallu que je surcharge la méthode toArray(), en voici un exemple :

    /**
     * Surcharghe toArray() de Model pour former
     * un tableau qui sera transformé en JSON
     * @return type tableau de propriétés
     */
    public function toArray() {
        $data = parent::toArray();
        $data['department'] = $this->department;
        $data['job'] = $this->job; 
        // On ne prend pas en compte la propriété
        // manager à cause de la récursivité
        // qui génèrerait des flux trop importants
        // et prendrait beaucoup de ressource sur le serveur
//        $data['manager'] = $this->manager;
        return $data;
    }  
Et si toutes les relations sont chargées automatiquement.
Je n'ai pas trouvé comme dans JPA d'option Lazy ou Early permettant de ne charger une relation qu'à la demande.
Posté il y a 8 mois

Vous ne pouvez pas répondre à ce sujet.