sigurd.g

Řeším zapeklitý problém (pro mě). Laravel používám jako (json) API. Mám dva objekty : Client, Project. vazbz jsou : "client has many projects" a "project belongs to client".

A potřebuju aby mi v api byl vrácen u klienta i seznam projektů A u projektu client.

Řešil jsem to pomocí protected $appdends ale ... Tam je ten háček.

Zacykli se to. Klient má projekty a projekty mají klienta kterej má projekty...

ukázka :

client : {
 name: 'klientA',
 projects : [{
  name: 'prejktA',
  client: {
   name: 'klientA',
   projects : [{
    name: 'prejktA',
    client: {
     name: 'klientA',
      ....
    }
   }]
  }
 }]
}

Jak se tohle má řešit "správně" ? Mám snad mapovat v kontroleru kolekci a otrocky každý model ručně ?

Ešte nie si členom CZ/SK Laravel komunity?

To možeš ľahko zmeniť. Registrácia je zdarma a ako registrovaný člen získaš množstvo výhod. Prečítaj si prečo by si mal byť členom.

Prihlásiť sa Zaregistrovať
Zoradiť odpovede:
leodocz
by @leodocz (105), pred 4 mesiacmi

Ahoj, správné řešení by bylo vytvořit Resource ke každému modelu - Client a Project - a v jednotlivých resource si definuješ podobu výsledného json api.

https://laravel.com/docs/5.8/eloquent-resources

xvital
by @xvital (387), pred 4 mesiacmi

Jednoznacna a jedina spravna odpoved asi neexistuje. Moznosti je niekolko.

S tym cyklenim je to problem, ktory ModelResource sam o sebe neriesi (cyklit sa ti to bude rovnako aj ked pouzijes Resources).

Osobne preferujem, ak je odpoved na akykolvek API call vratena ako Resource, pretoze Resource wrapper (rozdelenie do casti data, links, meta, ...) je prijemnym standardom.

Do akej hlbky potrebujes mat tie vztahy obsiahnute vo vyslednom objekte? Staci ak Client bude mat Project, ktory uz nebude obsahovat klientov?

Celkom elegantne riesenie je pouzit Eager load v modeli a nasledne v Resource na vztah podmienku whenLoaded