====== Symfony et les Entities (Entity)====== ===== Prérequis ===== Avant de jouer avec les Entities il faut que la [[prog:symfony:doctrine:databases|base de données soit paramétrée et créée]]. -> Source : [[https://symfony.com/doc/current/doctrine.html#configuring-the-database]] ===== Entity ===== Une Entity est un **Objet PHP** qui sera stocké en base de donnée via l'ORM de Symfony Pour créer une Entity on utilisera la commande ''symfony console make:entity %EntityName%'' (voir ci-dessous). -> Source : [[https://symfony.com/doc/current/doctrine.html#creating-an-entity-class]] ===== Création d'une Entity ===== Le but ici est de créé une ''entity'' avec les champs suivants: * **Name** : string * **Url** : string * **VMaj** : integer * **VMin**: integer * **Revision** : integer * **Construction** : integer * **Online_Date** : Date ==== make:entity ==== Avec la console ''php bin\console make:entity'' ou ''symfony console make:entity'' D:\webprojects\test-api-project>php bin\console make:entity Class name of the entity to create or update (e.g. BraveGnome): > Projects created: src/Entity/Projects.php created: src/Repository/ProjectsRepository.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 to stop adding fields): > name Field type (enter ? to see all types) [string]: > string Field length [255]: > 40 Can this field be null in the database (nullable) (yes/no) [no]: > no updated: src/Entity/Projects.php Add another property? Enter the property name (or press to stop adding fields): > url Field type (enter ? to see all types) [string]: > string Field length [255]: > Can this field be null in the database (nullable) (yes/no) [no]: > no updated: src/Entity/Projects.php Add another property? Enter the property name (or press to stop adding fields): > vmaj Field type (enter ? to see all types) [string]: > integer Can this field be null in the database (nullable) (yes/no) [no]: > updated: src/Entity/Projects.php Add another property? Enter the property name (or press to stop adding fields): > vmin Field type (enter ? to see all types) [string]: > integer Can this field be null in the database (nullable) (yes/no) [no]: > updated: src/Entity/Projects.php Add another property? Enter the property name (or press to stop adding fields): > revision Field type (enter ? to see all types) [string]: > integer Can this field be null in the database (nullable) (yes/no) [no]: > updated: src/Entity/Projects.php Add another property? Enter the property name (or press to stop adding fields): > construction Field type (enter ? to see all types) [string]: > integer Can this field be null in the database (nullable) (yes/no) [no]: > updated: src/Entity/Projects.php Add another property? Enter the property name (or press to stop adding fields): > online_date Field type (enter ? to see all types) [string]: > date Can this field be null in the database (nullable) (yes/no) [no]: > updated: src/Entity/Projects.php Add another property? Enter the property name (or press to stop adding fields): > Success! Next: When you're ready, create a migration with make:migration === Types de champs possibles=== Main types * string * text * boolean * integer (or smallint, bigint) * float Relationships / Associations * relation (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 * json_array * decimal * guid === Fichier Entity généré === id; } public function getName(): ?string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } public function getUrl(): ?string { return $this->url; } public function setUrl(string $url): self { $this->url = $url; return $this; } public function getVmaj(): ?int { return $this->vmaj; } public function setVmaj(int $vmaj): self { $this->vmaj = $vmaj; return $this; } public function getVmin(): ?int { return $this->vmin; } public function setVmin(int $vmin): self { $this->vmin = $vmin; return $this; } public function getRevision(): ?int { return $this->revision; } public function setRevision(int $revision): self { $this->revision = $revision; return $this; } public function getConstruction(): ?int { return $this->construction; } public function setConstruction(int $construction): self { $this->construction = $construction; return $this; } public function getOnlineDate(): ?\DateTimeInterface { return $this->online_date; } public function setOnlineDate(\DateTimeInterface $online_date): self { $this->online_date = $online_date; return $this; } } === Fichier Repository généré === createQueryBuilder('p') ->andWhere('p.exampleField = :val') ->setParameter('val', $value) ->orderBy('p.id', 'ASC') ->setMaxResults(10) ->getQuery() ->getResult() ; } */ /* public function findOneBySomeField($value): ?Projects { return $this->createQueryBuilder('p') ->andWhere('p.exampleField = :val') ->setParameter('val', $value) ->getQuery() ->getOneOrNullResult() ; } */ } ==== make:migration ==== D:\webprojects\test-api-project>php bin/console make:migration Success! Next: Review the new migration "src/Migrations/Version20191027131103.php" Then: Run the migration with php bin/console doctrine:migrations:migrate See https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html Voir : [[https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html]] === Fichier de migration généré === abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('CREATE TABLE projects (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(40) NOT NULL, url VARCHAR(255) NOT NULL, vmaj INT NOT NULL, vmin INT NOT NULL, revision INT NOT NULL, construction INT NOT NULL, online_date DATE NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB'); } public function down(Schema $schema) : void { // this down() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); $this->addSql('DROP TABLE projects'); } } ==== doctrine:migrations:migrate ==== D:\webprojects\test-api-project>php bin/console doctrine:migrations:migrate Application Migrations WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y Migrating up to 20191027131103 from 0 ++ migrating 20191027131103 -> CREATE TABLE projects (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(40) NOT NULL, url VARCHAR(255) NOT NULL, vmaj INT NOT NULL, vmin INT NOT NULL, revision INT NOT NULL, construction INT NOT NULL, online_date DATE NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ++ migrated (took 557.6ms, used 16M memory) ------------------------ ++ finished in 569.9ms ++ used 16M memory ++ 1 migrations executed ++ 1 sql queries === Résultats de la migration === {{:prog:symfony:table_projetcs.png|}} ====== Resources ====== * [[https://symfony.com/doc/current/doctrine.html]]