# 05 1:1 Relaties, hoofdsteden *In deze les gaan we bekijken hoe je relaties legt tussen tabellen en hoe je informatie uit andere tabellen kan afdrukken in je eigen view.* ### Wat leren we? - we kijken naar relaties in tabellen met primary key en foreign key - we leren hoe je een 1:N relatie tussen twee tabellen in Yii kan definiëren. - we leren hoe je met behulp van een relatie gegevens bij een overzicht uit een andere tabel kan afdrukken. - we leren hoe je met behulp van een relatie vanuit een overzicht naar een andere overzicht kan springen. ### Inleiding Een relatie in de view wordt altijd gelegd tussen één regel (row/record) van één tabel naar één of meer rijen in een andere tabel. Omdat de relatie vanuit één 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 vorige les hebben gemaakt. We gaan een kolom toevoegen waarin de hoofdstad van het land wordt getoond. [![image-1615887892142.png](https://www.roc.ovh/uploads/images/gallery/2021-03/scaled-1680-/image-1615887892142.png)](https://www.roc.ovh/uploads/images/gallery/2021-03/image-1615887892142.png) ### 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. [![image-1615888192933.png](https://www.roc.ovh/uploads/images/gallery/2021-03/scaled-1680-/image-1615888192933.png)](https://www.roc.ovh/uploads/images/gallery/2021-03/image-1615888192933.png) Vanuit de country table kun je via de foreign key *Capital* verwijzen naar de Name in de gekoppelde tabel city. ```PHP $country->hoofdstad->Name; ``` Met dit statement verwijs je vanuit de *country* tabel, via de relatie *hoofdstad* naar de N*ame* (naam) van de hoofdstad. De relatie *hoofdstad* bestaat nog niet. De relatie hoofdstad moet nog worden gecodeerd. Dit doen we in de *model* file van Country. ```PHP // models/Country.php public function getHoofdstad() { return $this->hasOne(City::className(), ['ID' => 'Capital']); } ``` De functie *getHoofdstad* vertel jij Yii hoe de relatie tussen de tabel *Country* en *City* in elkaar zit. Een relatie begint in Yii altijd met *get* gevolgd door de naam van de relatie. In dit geval is de naam van de relatie hoofdstad. De function heet daarom *getHoofdstad*. Het is een 1:1 relatie; elke country heeft één hoofdstad. Dat vertellen we met *hasOne* op regel 5. Verder plaatsen we op regel 5 de primary key (*ID*) en de foreign key (*Capital).* Een 1:1 relatie wordt dus op de volgende manier gemaakt:`` ```PHP public function get() { return $this->(::className(), ['' => '']); } ``` In een query zou de relatie er als volgt uit zien: ```SQL SELECT * FROM Country LEFT JOIN City ON Country.Capital = City.ID ``` 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 05a
**Lees** de uitleg hierboven goed door en plaats de kolom hoofdstad in het overzicht. [![image-1615887892142.png](https://www.roc.ovh/uploads/images/gallery/2021-03/scaled-1680-/image-1615887892142.png)](https://www.roc.ovh/uploads/images/gallery/2021-03/image-1615887892142.png) Maak hiervoor twee aanpassingen: 1. 1. maak de relatie in het model van *Country*, en 2. pas de view *overzicht* aan door daar de kolom *Hoofdstad* aan toe te voegen.
Let op! In de database zit een land zonder hoofdstad. Zolang je alleen de landen uit Europa afdrukt gaat alles goed, want in Europa hebben alle landen een hoofdstad. Als je alle landen met hun hoofdsteden van de hele wereld probeert af te drukken zul je een foutmelding krijgen omdat er dus (ten minste) één land zonder hoofdstad bestaat. ### Inleveren 1. Een schermafdruk yii-05a-<jouw naam> van je country view waarin de kolommen Naam, Hoofdstad en Oppervlakte worden afgedrukt, zoals in het voorbeeld hierboven. Maak een afdruk van je gehele browserscherm. ### Opdracht 05b We gaan de Hoofdstad clickable maken. Als je naar [http://localhost:8080/city](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>](http://localhost:8080/city/view?id=) als url en <NR> is het ID van de stad. Dus als je bijvoorbeeld klikt op [http://localhost:8080/city/view?id=5](http://localhost:8080/city/view?id=5) dan zie je informatie over Amsterdam.
##### Opdracht 2 Maak elke hoofdstad in het overzicht dat je bij opdracht 1 hebt gemaakt *clickable. Als je op de link klikt dan* open je het overzicht van de stad, bijvoorbeeld [http://localhost:8080/city/view?id=5](http://localhost:8080/city/view?id=5). Tip: je kunt Html:a() gebruiken om een link te maken. Dit is in de [vorige les uitgelegd](https://www.roc.ovh/link/303#bkmrk-zet-eerst-boven-aan-). [![image-1615896595590.png](https://www.roc.ovh/uploads/images/gallery/2021-03/scaled-1680-/image-1615896595590.png)](https://www.roc.ovh/uploads/images/gallery/2021-03/image-1615896595590.png)
### Inleveren 1. Jouw country view (view/country/index.php). Plaats in je country view commentaar met jouw naam. \--