PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/kohana/modules/userguide/guide/nl/tutorials.orm.md

https://github.com/alfons56/Kohana
Markdown | 298 lines | 193 code | 105 blank | 0 comment | 0 complexity | 75bce1e82a5f2b8826e885f1b9482908 MD5 | raw file
  1. # ORM {#top}
  2. Kohana 3.0 bevat een krachtige ORM-module die het "active record"-patroon gebruikt en database introspectie gebruikt om kolominformatie te bepalen van een model.
  3. De ORM-module is opgenomen in de Kohana 3.0 installatie maar moet worden ingeschakeld vooraleer je het kunt gebruiken. In je `application/bootstrap.php` bestand moet je de oproen naar [Kohana::modules] aanpassen en de ORM-module insluiten:
  4. Kohana::modules(array(
  5. ...
  6. 'orm' => MODPATH.'orm',
  7. ...
  8. ));
  9. ## Configuratie {#configuration}
  10. ORM vergt weinig configuratie om aan de slag te kunnen. Breid uw model classes uit met ORM om de module te kunnen gebruiken:
  11. class Model_User extends ORM
  12. {
  13. ...
  14. }
  15. In het voorbeeld hierboven zal het model zoeken naar een tabel `users` in de standaard database.
  16. ### Model Configuratie Properties
  17. De volgende eigenschappen worden gebruikt om ieder model te configureren:
  18. Type | Eigenschap | Omschrijving | Standaard waarde
  19. ----------|---------------------|--------------------------------------| -------------------------
  20. `string` | _table_name | Tabelnaam om te gebruiken | `singular model name`
  21. `string` | _db | Naam van de database om te gebruiken | `default`
  22. `string` | _primary_key | Kolom die dient als primary key | `id`
  23. `string` | _primary_val | Kolom die dient als primary value | `name`
  24. `bool` | _table_names_plural | Zijn de tabelnamen meervoudig? | `TRUE`
  25. `array` | _sorting | Array met kolom => volgorde | `primary key => ASC`
  26. `string` | _foreign_key_suffix | Achtervoegsel voor foreign keys | `_id`
  27. ## Het gebruik van ORM
  28. ### Een Record inladen
  29. Om een instantie van een model aan te maken, kan je de [ORM::factory] methode of [ORM::__construct] gebruiken:
  30. $user = ORM::factory('user');
  31. // of
  32. $user = new Model_User();
  33. De constructor en factory methodes accepteren ook een primary key waarde om het gegeven model's data in te laden:
  34. // Laad gebruiker met ID 5
  35. $user = ORM::factory('user', 5);
  36. // Kijk of de gebruiker succesvol werd ingeladen
  37. if ($user->loaded()) { ... }
  38. Je kan optioneel een array met keys => value paren meegeven om een data object in te laden die voldoet aan de gegeven criteria:
  39. // Laad een gebruiker met email joe@example.com
  40. $user = ORM::factory('user', array('email' => 'joe@example.com'));
  41. ### Zoeken naar één of meerdere records
  42. ORM ondersteunt de meeste krachtige [Database] methoden voor het doorzoeken van gegevens van uw model. Zie de `_db_methods` eigenschap voor een volledige lijst van ondersteunde methode oproepen. Records worden opgehaald met behulp van de [ORM::find] en [ORM::find_all] functies.
  43. // Dit zal de eerste actieve gebruiker nemen met de naam Bob
  44. $user = ORM::factory('user')
  45. ->where('active', '=', TRUE)
  46. ->where('name', '=', 'Bob')
  47. ->find();
  48. // Dit zal alle gebruikers nemen met de naam Bob
  49. $users = ORM::factory('user')
  50. ->where('name', '=', 'Bob')
  51. ->find_all();
  52. Wanneer je een lijst van modellen ontvangt met behulp van [ORM::find_all], kan je deze doorlopen zoals je doet met database resultaten:
  53. foreach ($users as $user)
  54. {
  55. ...
  56. }
  57. Een zeer handige functie van ORM is de [ORM::as_array] methode die het record zal teruggeven als een array. Indien je dit gebruikt met [ORM::find_all], zal een array van alle records worden teruggegeven. Een goed voorbeeld van wanneer dit nuttig is, is voor select in het HTML formulier:
  58. // Toon een dropdown/select met daarin alle gebruikersnamen (id als value van de options)
  59. echo Form::select('user', ORM::factory('user')->find_all()->as_array('id', 'username'));
  60. ### Het aantal records tellen
  61. Gebruik [ORM::count_all] om het aantal records terug te geven voor een bepaalde query.
  62. // Aantal actieve gebruikers
  63. $count = ORM::factory('user')->where('active', '=', TRUE)->count_all();
  64. Als je het totaal aantal gebruikers wilt tellen voor een bepaalde query, terwijl je enkel een bepaalde set van deze gebruikers wilt tonen, gebruik dan de [ORM::reset] methode met `FALSE` vooraleer je `count_all` gebruikt:
  65. $user = ORM::factory('user');
  66. // Totaal aantal gebruikers (reset FALSE zorgt ervoor dat het query object dat het query object niet geleegd wordt)
  67. $count = $user->where('active', '=', TRUE)->reset(FALSE)->count_all();
  68. // Geef enkel de eerste 10 resultaten terug van deze resultaten
  69. $users = $user->limit(10)->find_all();
  70. ### Properties van een model aanspreken
  71. Alle model properties zijn toegankelijk via de `__get` en `__set` magic methodes.
  72. $user = ORM::factory('user', 5);
  73. // Geef de gebruikersnaam terug
  74. echo $user->name;
  75. // Verander de gebruiker zijn naam
  76. $user->name = 'Bob';
  77. Voor het opslaan van gegevens/properties die niet bestaan in de tabel van het model, kan je gebruik maken van het `_ignored_columns` data member. De gegevens zullen worden opgeslagen in het interne `_object` member, maar zal worden genegeerd op database-niveau.
  78. class Model_User extends ORM
  79. {
  80. ...
  81. protected $_ignored_columns = array('field1', 'field2', );
  82. ...
  83. }
  84. Meerdere key => value paren kunnen worden ingesteld door gebruik te maken van de [ORM::values] methode.
  85. $user->values(array('username' => 'Joe', 'password' => 'bob'));
  86. ### Aanmaken en opslaan van records
  87. De methode [ORM::save] wordt gebruikt om zowel nieuwe records aan te maken als het upaten van bestaande.
  88. // Nieuw record aanmaken
  89. $user = ORM::factory('user');
  90. $user->name = 'Nieuwe gebruiker';
  91. $user->save();
  92. // Aanpassen van een bestaand record
  93. $user = ORM::factory('user', 5);
  94. $user->name = 'Gebruiker 2';
  95. $user->save();
  96. // Controleer of het record opgeslagen is
  97. if ($user->saved()) { ... }
  98. Je kan meerdere records tegelijk veranderen met de [ORM::save_all] methode:
  99. $user = ORM::factory('user');
  100. $user->name = 'Bob';
  101. // Verander bij alle actieve gebruikers de naam naar 'Bob'
  102. $user->where('active', '=', TRUE)->save_all();
  103. #### Gebruik `Updated` en `Created` kolommen
  104. De `_updated_column` en `_created_column` members staan ter beschikking om automatisch aangepast te worden wanneer een model wordt gecreëerd of aangepast. Ze worden standaard niet gebruikt. Om ze te gebruiken:
  105. // date_created is de kolom die wordt gebruikt om de aanmaak datum op te slaan. Gebruik format => TRUE om een timestamp op te slaan
  106. protected $_created_column = array('date_created', 'format' => TRUE);
  107. // date_modified is de kolom die wordt gebruikt om de datum op te slaan wanneer het item is aangepast. In dit geval wordt een string gebruikt om een date() formaat te specificeren
  108. protected $_updated_column = array('date_modified', 'format' => 'm/d/Y');
  109. ### Verwijderen van records
  110. Records worden verwijderd met [ORM::delete] en [ORM::delete_all]. Deze methoden werken op dezelfde manier als het opslaan van records zoals hierboven beschreven, met de uitzondering dat [ORM::delete] nog een optionele parameter heeft, het `id` van het record om te verwijderen. Anders wordt het huidig ingeladen record verwijderd.
  111. ### Relaties
  112. ORM ondersteunt zeer goed relateies. Ruby heeft een [goede tutorial omtrent relaties](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html).
  113. #### Belongs-To en Has-Many
  114. We gaan er van uit dat we werken met een school dat veel (has many) studenten heeft. Iedere student kan enkel maar tot één school behoren (belong to). Dan zullen de relaties als volgt gedefinieerd worden:
  115. // In het model "school"
  116. protected $_has_many = array('students' => array());
  117. // In het model "student"
  118. protected $_belongs_to = array('school' => array());
  119. Om een student zijn school te verkrijgen gebruik je:
  120. $school = $student->school;
  121. Om een school zijn studenten te verkrijgen gebruik je:
  122. // Merk op dat find_all is vereist na "students"
  123. $students = $school->students->find_all();
  124. // Om resultaten te "filteren":
  125. $students = $school->students->where('active', '=', TRUE)->find_all();
  126. Standaard zal ORM willen zoeken naar een `school_id` model in de studenten tabel. Dit kan worden overschreven door gebruik te maken van het `foreign_key` attribuut:
  127. protected $_belongs_to = array('school' => array('foreign_key' => 'schoolID'));
  128. De foreign key moet overschreven worden in zowel het student als school model.
  129. #### Has-One
  130. Has-One is een speciale versie van Has-Many, het enige verschil is dat er maar één enkel record is. In het bovenstaande voorbeeld zou iedere school maar één student hebben (al is dat wel een slecht voorbeeld).
  131. // In het model "school"
  132. protected $_has_one = array('student' => array());
  133. Je moet niet zoals bij Belongs-To de `find` methode gebruiken wanneer je verwijst naar een het Has-One gerelateerd object, dit gebeurt automatisch.
  134. #### Has-Many "Through"
  135. De Has-Many "through" relatie (ook bekend als Has-And-Belongs-To-Many) wordt gebruikt in het geval dat één object gerelateerd is met meerdere objecten van verschillende types en omgekeerd. Bijvoorbeeld, een student kan verschillende klassen volgen en een klass kan verschillende studenten hebben. In dit geval wordt een derde tabel gebruikt en een model die dienst doet als `pivot`. In dit geval noemen we het pivot object/model `enrollment` (=inschrijving).
  136. // In het model "student"
  137. protected $_has_many = array('classes' => array('through' => 'enrollment'));
  138. // In het model "class"
  139. protected $_has_many = array('students' => array('through' => 'enrollment'));
  140. De inschrijvingstabel (`enrollment`) moet twee foreign keys hebben, een voor `class_id` en de andere voor `student_id`. Deze kunnen worden overschreven door `foreign_key` en `far_key` te gebruiken bij het definiëren van de relatie. Bijvoorbeeld:
  141. // In het model "student" (de foreign key verwijst naar dit model [student], terwijl de far key verwijst naar het andere model [class])
  142. protected $_has_many = array('classes' => array('through' => 'enrollment', 'foreign_key' => 'studentID', 'far_key' => 'classID'));
  143. // In het model "class"
  144. protected $_has_many = array('students' => array('through' => 'enrollment', 'foreign_key' => 'classID', 'far_key' => 'studentID'));
  145. Het inschrijvings model (enrollment) zal als volgt gedefinieerd worden:
  146. // Het model "enrollment" hoort bij zowel "student" als "class"
  147. protected $_belongs_to = array('student' => array(), 'class' => array());
  148. Om de gerelateerde objecten te bereiken, gebruik je:
  149. // Om de klassen van een student te verkrijgen
  150. $student->classes->find_all();
  151. // Om studenten te verkrijven vanuit de klas
  152. $class->students->find_all();
  153. ### Validatie
  154. ORM werkt nauw samen met de [Validate] library. ORM biedt de volgende members aan voor validatie
  155. * _rules
  156. * _callbacks
  157. * _filters
  158. * _labels
  159. #### `_rules`
  160. protected $_rules = array
  161. (
  162. 'username' => array('not_empty' => array()),
  163. 'email' => array('not_empty' => array(), 'email' => array()),
  164. );
  165. `username` zal gecontroleerd worden om zeker niet leeg te zijn. `email` zal ook gecontroleerd worden om te verzekeren dat het een geldig emailadres is. De lege arrays die als values worden meegestuurd, kunnen worden gebruikt om optionele parameters mee te geven aan deze functie aanroepen.
  166. #### `_callbacks`
  167. protected $_callbacks = array
  168. (
  169. 'username' => array('username_unique'),
  170. );
  171. `username` zal worden meegestuurd naar een callback methode `username_unique`. Als de methode bestaat in het huidige model, zal het worden gebruikt, anders zal een globale functie worden opgeroepen. Hier is een voorbeeld van z'n methode:
  172. public function username_unique(Validate $data, $field)
  173. {
  174. // Logica om te controleren of de gebruikersnaam uniek is
  175. ...
  176. }
  177. #### `_filters`
  178. protected $_filters = array
  179. (
  180. TRUE => array('trim' => array()),
  181. 'username' => array('stripslashes' => array()),
  182. );
  183. `TRUE` slaat erop dat de `trim` filter wordt gebruikt voor alle velden. `username` zal ook gefilterd worden door `stripslashes` vooraleer het gevalideerd wordt. De lege arrays die als values worden meegestuurd, kunnen worden gebruikt om optionele parameters mee te geven aan deze filter-functie aanroepen.
  184. #### Controleren of een Object Valid is
  185. Gebruik [ORM::check] om te kijken of het object momenteel valid is.
  186. // Een object zijn values instellen en dan controleren of het valid is
  187. if ($user->values($_POST)->check())
  188. {
  189. $user->save();
  190. }
  191. Je kan de `validate()` methode gebruiken om een model zijn validatie object aan te roepen.
  192. // Een optionele filter manueel toevoegen
  193. $user->validate()->filter('username', 'trim');