Laravel France

API Rest relations non prises en charge

  • Avatar de AlainArsane
    Membre depuis :
    26/08/2016
    Messages :
    13

    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.

  • Avatar de Dom
    Membre depuis :
    17/07/2017
    Messages :
    36

    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 ?

  • Avatar de stockhausen
    Membre depuis :
    05/11/2013
    Messages :
    36

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

  • Avatar de AlainArsane
    Membre depuis :
    26/08/2016
    Messages :
    13

    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.

Vous ne pouvez pas répondre à ce sujet.