6, Relaties 1:1 en 1:N
DEZE EN VOLGENDE LESSEN WORDEN NOG AANGEPAST
In deze les gaan we bekijken hoe je relaties legt tussen tabellen en hoe je informatie uit andere tabellen kan afdrukken in jouw view.
Een relatie in de view wordt altijd gelegd tussen één regel (row/record) en een andere tabel. Omdat de relatie vanuit de regel wordt gelegd, is er dus altijd sprake van een 1:1 of 1:N relatie. We gaan beide relaties apart bespreken en uittesten met voorbeelden.
Als uitgangspunt nemen onze eigen view die we in de vorigen les hebben gemaakt. We gaan een kolom toevoegen waarin de hoofdstad van el land wordt getoond.
1:1 relatie
Bekijk de World database. In de country tabel staat de kolom Capital, dit is een foreign key die verwijst naar de primary key ID in de city table.
Vanuit de country table kun je via de foreign key Capital verwijzen naar de Name in de gokoppelde tabel city.
$country->hoofdstad->Name;
Met dit statement verwijs je vanuit de country tabel, via de relatie hoofdstad naar de Name (naam) van de hoofdstad.
Nu moet de relatie hoofdstad alleen nog worden geprogrammeerd. Dit doen we in de model file van Country.
// models/Country.php
public function getCapital(getHoofdstad()
{
return $this->hasOne(City::className(), ['ID' => 'Capital']);
}
De functie getCapitalgetHoofdstad verteltvertel jij Yii hoe de relatie tussen de tabel Country en City in elkaar zit.
De functie heet getCapital en daarom heet de relatie Capital (get valt dus weg).
|
Een 1:1 relatie wordt dus op de volgende manier gemaakt:
public function get<RELATIE NAAM>()
{
return $this-><RELATIE SOORT>(<RIGHT TABEL>::className(),
['<PRIMARY KEY RIGHT TABLE>' => '<FOREIGN KEY LEFT TABLE>']);
}
In een query zou de relatie er als volgt uit zien:
SELECT *
FROM Country
LEFT JOIN City
ON Country.Capital = City.ID
Nogmaals dit wordt allemaal voor je ingevuld als je een goede database definitie hebt waarin ook de relaties zijn gedefinieerd.
De relatie is gemaakt in het Model van Country en is dan ook alleen vanuit Country Beschikbaar. Je kunt in een view van Country dan gegevens uit de relatie afdrukken door:
$country-><relatie_naam>-><kolom naam>
Opdracht 1
We gaan de Hoofdstad clickable maken. Als je naar http://localhost:8080/city gaat dan zie je het overzicht van steden. Klik op een oogje op een van de steden. Let op de URL. Je ziet http://localhost:8080/city/view?id=<NR> als url en <NR> is het ID van de stad. Dus als je bijvoorbeeld klikt op http://localhost:8080/city/view?id=5 dan zie je informatie over Amsterdam.
Let op! Een relatie mag niet dezelfde naam hebben als een kolom uit de tabel waarin deze relatie bestaat. 1:N relatieIn de World database staat een tabel countrylanguage. In deze tabel staan talen per land welke talen er worden gesproken en per taal wordt ook nog aangegeven welk percentage van de bevolking de taal spreekt. De relatie tussen country en countrylanguage is 1:N. Namelijk in een land worden 1 of meer talen gesproken. We willen een overzicht maken dat er als volgt uitgaat zien: In dit voorbeeld zien we dat in Indonesië 8 talen worden gesproken. We gaan ons overzicht aanpassen, zodat we per land alle talen die er worden gesproken netjes in de tabel worden weergegeven zoals hierboven in het voorbeeld is te zien. Hoe werkt dit? Bij de 1:1 relatie hierboven konden we via Bij een 1:N relatie werkt het hetzelfde als bij de 1:1 relatie. Dus in het model (models/Country.php) s de relatie beschreven:
We kunnen nu vanuit de view (views/country/overzicht.php) via Er is alleen één belangrijk verschil, omdat we geen 1:1 relatie hebben, maar een 1:N, krijgen we geen variabele terug maar een array. We moeten het dus met een loop door het array heen lopen.
De variabele $language is willekeurig gekozen, dit is de variabele die $country->language[0], $country->language[1], $country->language[2], etc. etc.
{{@314}}
Question: waarom moet de functie getCapital met de hand worden toegevoegd?De model generator van Yii kijkt naar de database relaties aan de hand van de foreign key contraints die je in phpMyAdmin kunt instellen. Je kunt de relaties ook tekenen door de juiste lijntjes te trekken in de designer module van phpMyAdmin. Als de relaties niet goed zijn gedefinieerd dan zul je de relaties tussen de foreign key en de primairy key zelf moeten toevoegen in de model file.
Back to top
|