MBO-SD : De site voor software developer in het MBO
Model (Entities) in Symfony
Model of Entity?
            In het MVC model heb je de models, in het geval van Symfony heten ze Entities. Daar waar we op 
            MBO-SD schrijven over Models bedoelen we ook Entities en andersom. Het is op deze site dus hetzelfde.
        
            Een Entity is een object in Symfony waar je data in/ uit kan halen. Een Entity is praktisch altijd
            verbonden aan een tabel in de database. Met Symfony kan je deze ook vrij makkelijk aanmaken.
        
Aanmaken van een nieuwe Entity
            Om een entity aan te maken heb je het commando 
            symfony console make:entity [EntityName]
            
            Als je het commando uitvoert zonder een naam zal de eerste vraag de naam van de Entity te zijn, maar je kan ook
            het commando uitvoeren met de naam na make:entity.
        
Niet voor de User entity
            Let op! Als je de User entity wilt aanmaken om te registreren en
            in te loggen, gebruik dan make:user.
            
            Meer hierover vind je bij het hoofdstuk in-/ uitloggen.
        
Belangrijk!
            Entities in Symfony zijn PHP-Classes en worden ALTIJD met hoofdletters geschreven.
            
            Een Entity is altijd enkelvoud, het is altijd verbonden met 1 rij/ deel uit de gekoppelde tabel
            
            Als je een nieuwe Entity aanmaakt wordt het veld id altijd toegevoegd als
            primary-key en met auto-increment erop. Dit hoef je zelf niet te doen!
            
            Je moet weten wat voor datatypen jouw velden zijn, hiervoor gebruik je uiteraard de ERD
            van jouw applicatie!
            
            Het datatype relation is een speciaal datatype, zie verderop voor meer informatie!
        
Per veld worden er 3-5 belangrijke vragen gesteld:
- De naam van de property (veld in de database)
- Datatype van de property (standaard string, dit is character varying)
- Afhankelijk van de datatype een of twee vragen over de datatype, bij een string bijvoorbeeld de grote (standaard 255 karakters)
- Mag de property leeg zijn in de database (nullable)
enter om te stoppen.
            Onderstaand een voorbeeld van een nieuwe Entity van een boek (Book).
# symfony console make:entity Book
 created: src/Entity/Book.php
 created: src/Repository/BookRepository.php
 Entity generated! Now let's add some fields!
 You can always add more fields later manually or by re-running this command.
 New property name (press <return> to stop adding fields):
 > name
 Field type (enter ? to see all types) [string]:
 > ?
Main Types
  * string
  * text
  * boolean
  * integer or smallint or bigint
  * float
Relationships/Associations
  * relation or a wizard 🧙 will help you build the relation
  * ManyToOne
  * OneToMany
  * ManyToMany
  * OneToOne
Array/Object Types
  * array or simple_array
  * json
  * object
  * binary
  * blob
Date/Time Types
  * datetime or datetime_immutable
  * datetimetz or datetimetz_immutable
  * date or date_immutable
  * time or time_immutable
  * dateinterval
Other Types
  * ascii_string
  * decimal
  * guid
 Field type (enter ? to see all types) [string]:
 > string
 Field length [255]:
 >
 Can this field be null in the database (nullable) (yes/no) [no]:
 >
 updated: src/Entity/Book.php
 Add another property? Enter the property name (or press <return> to stop adding fields):
 > description
 Field type (enter ? to see all types) [string]:
 >
 Field length [255]:
 >
 Can this field be null in the database (nullable) (yes/no) [no]:
 >
 updated: src/Entity/Book.php
 Add another property? Enter the property name (or press <return> to stop adding fields):
 >
  Success!
 Next: When you're ready, create a migration with symfony console make:migrationMaken van de migratie en uitvoeren van de migratie
            Als je de tekst goed leest raadt Symfony aan om een migratie bestand aan te maken, dit doe je met het
            commando symfony console make:migration (dit staat letterlijk ook in de tekst).
            
            Na het uitvoeren zie je ongeveer de volgende informatie terug
            
# symfony console make:migration
 created: migrations/Version20240330142545.php
  Success!
 Review the new migration then run it with symfony console doctrine:migrations:migrate
 See https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.htmlDit commando maakt een nieuw
Version- bestand aan in de map /migrations/Version----.php.
            Als je dit bestand bekijkt zie je de MYSQL commando's die uitgevoerd gaan worden.
            Als de migratie bestanden klaar gezet zijn kan je ze vervolgens uitvoeren met het commando:
            symfony console doctrine:migrations:migrate
            Dit zorgt ervoor dat de SQL-statements uit het
Version-- bestand uitgevoerd worden.
            Voer altijd de make:migration en doctrine:migrations:migrate uit na het maken of aanpassen van een Entity!
Aanpassen van een Entity
Om een Entity aan te passen, je wilt een property bijvoorbeeld toevoegen, gebruik je weer het commando wat je gebruikt om een Entity aan te maken, Symfony zal zien dat de Entity al bestaat en zal je vragen wat je wilt toevoegen.
# symfony console make:entity User
 Your entity already exists! So let's add some new fields!
 New property name (press <return> to stop adding fields):
 > date_of_birth
 Field type (enter ? to see all types) [string]:
 > ?
Main Types
  * string
  * text
  * boolean
  * integer or smallint or bigint
  * float
Relationships/Associations
  * relation or a wizard 🧙 will help you build the relation
  * ManyToOne
  * OneToMany
  * ManyToMany
  * OneToOne
Array/Object Types
  * array or simple_array
  * json
  * object
  * binary
  * blob
Date/Time Types
  * datetime or datetime_immutable
  * datetimetz or datetimetz_immutable
  * date or date_immutable
  * time or time_immutable
  * dateinterval
Other Types
  * ascii_string
  * decimal
  * guid
 Field type (enter ? to see all types) [string]:
 > date
 Can this field be null in the database (nullable) (yes/no) [no]:
 >
 updated: src/Entity/User.php
 Add another property? Enter the property name (or press  to stop adding fields):
 >
  Success!
 Next: When you're ready, create a migration with symfony console make:migration
 De repository
            Als je een nieuwe Entity maakt wordt er voor die Entity ook een repository gemaakt. Deze vind
            je in de map src/Repository en heeft altijd de naam van jouw entity met
            het woord Repository. Deze repository wordt gebruikt als link tussen de entity en de database.
            In de basis hoef je niets met het bestand te doen, je kan ze som in je functie gebruiken in plaats van de
            EntityManager aan te roepen.
        
De getters en setters
            Bij het object georieenteerd programmeren (OOP of object oriented programming) kan je de
            attributen van een entity nooit direct benaderen, maar doe je dit door een functie aan te roepen. Deze functies
            zijn getters (ophalen van informatie) en setters het wegschrijven/ aanpassen van
            informatie.
        
            Alle properties (velden) uit de database worden als getters en setters in de Entity
            geplaatst. Een User entity met de properties first_name, last_nameemail
            en age heeft de volgende getters en setters:
            
            
- ->getId() (er is geen setter voor het veld id)
- ->getFirstName() en ->setFirstName(<name>)
- ->getLastName() en ->setLastName(<name>)
- ->getEmail() en ->setEmail(<email>)
- ->getAge() en ->setAge(<email>)
first_name in de database wordt dus
            ->getFirstName() en ->setLastName(<name>
        
    