Bij deze les kan je naast de documentatie van Laravel.com ook gebruik maken van https://laracasts.com/series/30-days-to-learn-laravel-11 aflevering 11
In deze les gaan we aan de slag met relaties die tussen Modellen kunnen bestaan. Bijvoorbeeld:
- 1-op-veel
Product
heeft meerdereReviews
Review
hoort bij éénProduct
- Veel-op-veel
Product
heeft meerdereCategories
Category
hoort bij meerdereProducts
Vorig jaar hebben we gezien dat bij een 1-op-veel relatie het nodig was om een foreign key toe te voegen aan de tabel. Voor de veel-op-veel relatie hebben we een andere oplossing nodig en dat is een pivot table (koppeltabel). Bij het aanmaken van de database moeten we hier dus rekening mee houden.
Om hiermee te oefenen kun je in je eindproject een nieuw
Model
aanmaken dat een relatie zal hebben met een bestaand Model. Kies een Model dat past bij jouw context. Hieronder een voorbeeld van een stappenplan.
- Maak
Review
Model aan met behulp van het Artisan commando. Maak ook meteen de Migrations en Controller aan (dit kan een gewone Controller of een Resource Controller zijn, afhankelijk van de context). - Vul de Migration en Voeg de benodigde velden toe aan de
Migrations
die je nodig hebt en voeg de foreign keys toe voor de 1-op-veel relatie. Dit doe je door een veld toe te voegen metforeignId()
. Zie Laravel documentatie - Koppel de
Review
aan deProduct
in hetModel
. Kies hiervoor de juiste relatie in de Laravel documentatie. - Maak je een foutje met een
Migration
. Je kunt altijd een stap terug met het volgende commando. Let op je moet dedown
functie in de migration goed hebben gedefinieerd.Je kunt ook een aanpassing maken aan een migration en de database opnieuw laten opbouwen. Let op hiermee verwijder je alle data in de database.php artisan migrate:rollback
php artisan migrate:fresh
Kies welke CRUD-functionaliteit je nodig hebt voor het nieuwe Model. Bij een Review
is het bijvoorbeeld handig om
alleen de store
functie te maken, omdat het create formulier op de product.show
pagina staat.
Werk de benodige CRUD-functionaliteit uit.
- Zorg ervoor dat je in de
products.show
pagina de reviews van het product toont. - Maak een formulier aan om een review toe te voegen onder de reeds bestaande reviews. Hier kun je een component van maken.
- Zorg dat je de review kunt opslaan bij het betreffende product en na het opslaan moet je weer terugkeren naar de
products.show
pagina.
- Bij het aanmaken van het
Component
voor het reviewformulier kun je extra data meegeven. Maak hier gebruik van eenProp
. - Het Opslaan van een
Review
doe je in destore
functie van deReviewController
. Maak hiervoor een nieuwe route aan in deweb.php
file. En bedenk welke extra informatie je nodig hebt om een review op te slaan. - Om informatie op te halen uit een formulier gebruik je de
request
class. Info op Laravel.com. - Om een review op te slaan bij een product, heb je het
id
van het product nodig. Wanneer je deze hebt meegegeven in destore
functie van deReviewController
, kun je de review opslaan bij het betreffende product. - Met de
save
functie van een Model kun je het model opslaan in de database. Info over INSERT
- Maak een knop in de
products.index
pagina om een product te verwijderen. - Wanneer het product verwijderd wordt, moeten ook de bijbehorende reviews verwijderd worden. De database kan
dit automatisch voor je doen. In de
Migration
gebruik je hiervoorcascadeOnDelete()
, maar dat kan alleen als deforeign key
Constrainted is.
Voor de bonusopdracht zorg je ervoor dan een Product
meerdere Categories
kan hebben. Een Category
kan ook bij
meerdere Products
horen. Voor de functionaliteit betekent dit
- Op de
products.create
pagina kun je meerdere categorieën selecteren d.m.v. checkboxes. - Op de
products.show
pagina toon je ook de categorieën waar het product bij hoort. Deze kan je eventueel klikbaar maken - Op de
products.index
pagina kun je filteren op categorieën. Toon alle categorieën en maak deze op dezelfde manier klikbaar als op deproducts.show
pagina. Als je met eenComponent
werkt, kan je deze hergebruiken.
- Maak een
Category
Model aan met behulp van het Artisan commando. Maak ook meteen de Migration en Resource Controller aan. - Vul de
Migration
aan en voeg een name toe. - In dezelfde
Migration
voeg je ook de pivot table toe. Bedenk goed welke foreign keys hierin moeten komen. De naam van de pivot table bestaat uit de enkelvoudige vorm van de twee modellen in alfabetische volgorde. Deze start je met:Schema::create('category_product', function (Blueprint $table) { // code });
- Voeg de relaties toe aan de Models
Product
enCategory
. Laravel documentatie. - Maak slim gebruik van Componenten.
- Om een categorie bij een product op te slaan, in de store functie, kun je de functie
attach()
gebruiken. Documentatie