Laravel: nieuw table record met foreign key niet RESTful

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • kmsch
  • Registratie: Maart 2009
  • Laatst online: 10-10 14:50
Dag Tweakers,

Sinds een maand of twee ben ik PHP aan het leren. Nu heb ik recent de stap gemaakt naar Laravel en ik moet zeggen, het werkt prachtig. Maar ik loop tegen een probleem aan.

In mijn database zit een tabel 'Klanten'. Hieraan hangt een tabel 'Leerlingen' met een foreign key die verwijst naar Klanten. Nu wil ik een nieuwe Leerling kunnen invoegen, bijvoorbeeld met een button vanaf de Klant-show pagina. Ik moet echter een manier hebben om de foreign key door te geven aan het Leerlingen-formulier, zodat de leerling bij de klant hoort. Nu lukt me dat wel door die foreign key te POSTen naar de Leerlingen-create pagina, maar dat is niet RESTful omdat de create actie met een GET-methode plaats hoort te vinden. Momenteel zou ik dus een POST gebruiken.

Volgens mij is dit niet de goede aanpak. Ook zijn er andere tabellen met wel 5 foreign key's, dus dat wordt wel heel gek. Hoe lossen jullie dit op?

Alvast bedankt!

Groeten,
Koen

[ Voor 4% gewijzigd door kmsch op 06-01-2016 22:42 ]


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 19:34

Matis

Rubber Rocket

Volgens mij gebruik je juist een POST methode om een gegeven toe te voegen.

Ik plaats meestal in de POST URI ergens ook het klanten id. Of je zou die als hidden veld in je form kunnen stoppen.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
Ik snap de vraag niet helemaal?
Kan je niet gewoon een select meegeven aan het formulier waar de leerlingen instaan? Je zou dan ook een 0 kunnen gebruiken voor (nog) geen.

Betreft get vs post: de namen zeggen het al een beetje.. Genoeg info over te vinden. :)

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Hoe zitten die leerlingen onder de klanten? Kan een leerling maar 1 klant hebben of meerdere? Als dat er meerderen zijn (wat mij wel zo logisch lijkt), dan heb je ook een koppeltabel nodig die de leerlingen en klanten koppelt.

Wil je het netjes doen, dan zul je een route moeten hebben wat er als volgt uit ziet (voor creation):
/klant/{klant_id}/leerling/create
je create is dan een POST naar
/klant/{klant_id}/leerling/store
Op deze manier kan je een Klant model middels route model binding meegeven. Sla dan wel eerst de leerling op, dan kun je daarvan namelijk het id ophalen, om in de koppel tabel tezamen met de klant id op te slaan (en de relatie aan te leggen).

Andere - meest simpele - optie is om in je create formulier (zou dan dus /leerling/create zijn) een dropdown mee te geven met daarin de klant, zie niet zo 1 2 3 wat daar niet RESTful aan zou zijn, zolang je de Eloquent models goed hebt, hoef je niet gauw bang te worden. Foreign keys worden ook niet echt meer gebruikt door Eloquent / Laravel.

[ Voor 255% gewijzigd door CH4OS op 07-01-2016 00:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

kmsch schreef op woensdag 06 januari 2016 @ 22:34:
Nu lukt me dat wel door die foreign key te POSTen
:Y
maar dat is niet RESTful omdat de create actie met een GET-methode plaats hoort te vinden.
wut. :P

Je wilt toch gewoon het volgende doen lijkt mij:

code:
1
2
3
4
5
6
7
POST:/leerlingen
{
  someField: "someValue",
  someOtherField: "someOtherValue",
  klas_id: 5,
  school_id: 3
}


Let even op het verschil tussen POST (store) en PUT (update). In het laatste geval zal er in de URL een ID nodig zijn voor de resource die je wilt updaten. Bijvoorbeeld:


code:
1
2
3
4
5
6
PUT:/leerlingen/5
{
  someField: "someValue",
  someOtherField: "someOtherValue",
  klas_id: 5
}


Lees even goed de documentatie omtrent resourceful routing in Laravel :)
CptChaos schreef op woensdag 06 januari 2016 @ 23:16:
Op deze manier kan je een Klant model middels route model binding meegeven.
imho een van de grootste problemen met Laravel is dat je dus met closures in je routes file kan werken om naar behoeven requests af te handelen. Met andere woorden: je gaat in een routes.php file business/controller logic lopen afhandelen. Leuke features allemaal, maar zorgt wel voor hele, hele slechte gewoontes naar mijn mening. ;)

[ Voor 27% gewijzigd door Verwijderd op 07-01-2016 08:01 ]


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
kmsch schreef op woensdag 06 januari 2016 @ 22:34:
In mijn database zit een tabel 'Klanten'. Hieraan hangt een tabel 'Leerlingen' met een foreign key die verwijst naar Klanten. Nu wil ik een nieuwe Leerling kunnen invoegen, bijvoorbeeld met een button vanaf de Klant-show pagina. Ik moet echter een manier hebben om de foreign key door te geven aan het Leerlingen-formulier, zodat de leerling bij de klant hoort. Nu lukt me dat wel door die foreign key te POSTen naar de Leerlingen-create pagina, maar dat is niet RESTful omdat de create actie met een GET-methode plaats hoort te vinden. Momenteel zou ik dus een POST gebruiken.
Je zit er compleet naast. Hoe kom je op dat idee? Het is juist compleet standaard om HTTP verbs (POST, GET, DELETE, PUT) voor crud operaties te gebruiken.

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:17

Haan

dotnetter

kmsch schreef op woensdag 06 januari 2016 @ 22:34:
maar dat is niet RESTful omdat de create actie met een GET-methode plaats hoort te vinden. Momenteel zou ik dus een POST gebruiken.
Een GET moet idempotent zijn, dwz hoe vaak je de request ook doet, het resultaat zal altijd hetzelfde zijn. Dit is dus per definitie niet het geval bij een create actie.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 17:41
Haan schreef op donderdag 07 januari 2016 @ 09:06:
[...]

Een GET moet idempotent zijn, dwz hoe vaak je de request ook doet, het resultaat zal altijd hetzelfde zijn. Dit is dus per definitie niet het geval bij een create actie.
Jawel, als je de RESTful terminologie van Laravel aanhoudt, is een 'create' een GET, namelijk de pagina met het formulier waarop je het object wil aanmaken. Het opslaan ervan is de 'store' actie, dat is wel een POST.
Zie https://laravel.com/docs/...tful-resource-controllers
VerbPathActionRoute Name
GET/photoindexphoto.index
GET/photo/createcreatephoto.create
POST/photostorephoto.store
GET/photo/{photo}showphoto.show
GET/photo/{photo}/editeditphoto.edit
PUT/PATCH/photo/{photo}updatephoto.update
DELETE/photo/{photo}destroyphoto.destroy
In dit geval ga je een laag dieper, zoals CptChaos al zegt.

Als je klant_id 684 is, krijg je dus bijv. klanten/684/leerlingen/create
Die 684 is dan in je route dus {klant_id} bijv, en heb je als parameter in je controller.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Barryvdh schreef op donderdag 07 januari 2016 @ 10:06:
[...]

Jawel, als je de RESTful terminologie van Laravel aanhoudt, is een 'create' een GET, namelijk de pagina met het formulier waarop je het object wil aanmaken. Het opslaan ervan is de 'store' actie, dat is wel een POST.
Zie https://laravel.com/docs/...tful-resource-controllers

[...]


In dit geval ga je een laag dieper, zoals CptChaos al zegt.

Als je klant_id 684 is, krijg je dus bijv. klanten/684/leerlingen/create
Die 684 is dan in je route dus {klant_id} bijv, en heb je als parameter in je controller.
De pagina die het create formulier toont is inderdaad een GET, maar de daadwerkelijk object creatie is een POST.

De pagina zelf hoort natuurlijk ook niet bij de RESTful interface, maar is alleen een tool om die te gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • kmsch
  • Registratie: Maart 2009
  • Laatst online: 10-10 14:50
Het is me duidelijker, dank voor de reacties! Nog een vraag, hierop terugkomend:
Barryvdh schreef op donderdag 07 januari 2016 @ 10:06:
Als je klant_id 684 is, krijg je dus bijv. klanten/684/leerlingen/create
Die 684 is dan in je route dus {klant_id} bijv, en heb je als parameter in je controller.
Ik heb een table waarin een Les kan worden aangemaakt. Deze bevat keys vanuit Leerling, Klant, Docent, Lestype en ga zo dan maar door. Wordt de URL dan bij wijze van spreken klanten/684/leerlingen/41/docenten/2/lestype/5/lesuren/create ? Logischerwijs wel, maar het ziet er wat gek uit..

[ Voor 3% gewijzigd door kmsch op 08-01-2016 06:44 ]


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 17:41
kmsch schreef op vrijdag 08 januari 2016 @ 06:43:
Het is me duidelijker, dank voor de reacties! Nog een vraag, hierop terugkomend:


[...]


Ik heb een table waarin een Les kan worden aangemaakt. Deze bevat keys vanuit Leerling, Klant, Docent, Lestype en ga zo dan maar door. Wordt de URL dan bij wijze van spreken klanten/684/leerlingen/41/docenten/2/lestype/5/lesuren/create ? Logischerwijs wel, maar het ziet er wat gek uit..
Het ligt eraan, ik probeer meestal de url als logische representatie van je data en front end te hebben.
1ste pagina, klanten overzicht: /klanten
Toon alle lessen van klant 1: klanten/1/lessen
Alle leerlingen van klant 1: /klanten/1/lessen
Maar een docent of type, is dat een subniveau aan de voorkant, of is lestype gewoon een dropdown in je create formulier? Want dan hoeft hij niet in de url natuurlijk.
En als je wel alvast de waarde wil meegeven, maar niet als losse route, kan je ook in de query meegeven: ../create?les=5
Pagina: 1