De client communiceert met de server via een REST API.
Daarin komen veel typische CRUD operaties voor.
Ik neem even een application-domain als voorbeeld. In de applicatie kunnen offertes worden gemaakt voor klanten.
Offertes kunnen worden gemaakt, geüpdate, en verwijderd worden. Ze kunnen ook worden opgezocht aan de hand van een offertenummer, ze kunnen in een lijst worden getoond, etc.
Een offerte model heeft velden zoals creator_user en last_update_user, die weer een User business object zijn. Ook heeft een Quotation meerdere QuotationItem's in zich.
Op de server heb ik Laravel Eloquent modellen zoals Quotation, User, en QuotationItem.
Een Quotation heeft o.a. de volgende velden:
id, created_at, updated_at, opportunity_id, customer_account_id, creator_user_id, last_update_user_id, quotation_number, ......
En methods die de relaties aangeven:
// In Quotation class
public function creator_user()
{
return $this->hasOne(User::class);
}
public function last_update_user() {
return $this->hasOne(User::class);
}
public function quotation_items() {
return $this->hasMany(QuotationIten::class);
}
Bij het maken en updaten van een offerte vul ik die properties gewoon met de gewenste data.
Ik hoef bijvoorbeeld maar het user id in te vullen voor creator_user_id. De relatie met een User is hiermee al gelegd. De volgende keer dat de gemaakte offerte wordt opgehaald uit de database, kan a.d.h.v. het creator_user_id veld, de bijbehorende User worden geladen.
Bij het ophalen/lezen van data heb ik vragen. (Zeg maar het Read deel van CRUD...).
Als ik offertes in een lijst wil tonen, dan heb ik minder details nodig dan wanneer ik 1 specifieke offerte in zijn geheel wil weergeven.
Wil ik een hele offerte met alle bijbehorende data-relaties weergeven, dan laad ik die Quotation gewoon met zijn Eloquent relaties (zie relatie methods in code blok hierboven).
->with(['creator_user', 'last_edit_user', 'quotation_items']).
Ik krijg dan een associated array met alle data die ik nodig heb.
Toon ik ze in een lijst, dan hoef ik bijvoorbeeld géén QuotationItems erbij, en ook géén hele User objecten. Ik hoef dan dus alleen een response van de REST API met een JSON array van het uitgeklede Quotation object (in JSON).
Dus om offertes als lijst te laden, een response in de trant van:
{
"type": "success",
"data": {
"total_results": 2,
"results": [
{
"id": 3,
"created_at": "2022-11-19T16:20:42.000000Z",
"updated_at": "2022-11-19T16:20:42.000000Z",
"opportunity_id": 1,
"account_id": 3,
"quotation_number": "123-2022-1118-2",
"creator_user_id": 1,
"last_edit_user_id": 1,
"description": "Omschrijving hier...",
"expiration_date": "2022-12-18 12:00:00"
},
{
"id": 4,
"created_at": "2022-11-19T19:16:22.000000Z",
"updated_at": "2022-11-19T19:16:22.000000Z",
"opportunity_id": 1,
"account_id": 3,
"quotation_number": "123-2022-1118-3",
"creator_user_id": 1,
"last_edit_user_id": 1,
"description": "TEST Omschrijving.",
"expiration_date": "2022-12-18 12:00:00"
},
... en zo verder ...
]
}
}
Je ziet hier dat de properties creator_user_id en last_edit_user_id gewoon zijn meegeladen, zoals verwacht want deze velden zijn inherent/rechtstreeks van de Quotation class.
Nu stel dat ik toch wel graag bij elke offerte in de getoonde lijst de username wil laten zien. Met andere woorden, de JSON response moet voor elke offerte de usernames bevatten van de gebruiker die de offerte heeft gemaakt en degene die hem laatst heeft aangepast. Meer user gegevens hoeft niet.
Elk offerte JSON blok in de JSON array in de response wordt dan:
{
"id": 3,
"created_at": "2022-11-19T16:20:42.000000Z",
"updated_at": "2022-11-19T16:20:42.000000Z",
"opportunity_id": 1,
"account_id": 3,
"quotation_number": "123-2022-1118-2",
"creator_user_id": 1,
"creator_username": "Testgebruiker",
"last_edit_user_id": 1,
"last_edit_username": "EenAndereTestgebruiker",
"description": "Omschrijving hier...",
"expiration_date": "2022-12-18 12:00:00"
},
Hoe doe ik dat?