Symfony - tworzenie pierwszej tabeli w bazie danych

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 1717 razy

Na poprzedniej stronie tego działu opisałem jakże zaawansowane zagadnienie tworzenia bazy danych w Symfony teraz nadszedł najwyższy czas, aby rozpocząć przygodę z tworzeniem nowiusieńkiej tabelki w tej samej bazie danych co została utworzona uprzednio. Żeby nie przedłużać tego i tak już długiego wywodu o tworzeniu bazy danych w Symfony przejdźmy do sedna rzeczy i utwórzmy jakże upragnioną i pożądaną tabelkę.

No cóż! Nie od razu Kraków zaorano, więc najpierw zacznijmy od stworzenia klasy PHP, która to w jakże przebiegły sposób będzie opisywała pola zawarte w tabelce. W Symfony 4+ robi się to tak:

php bin/console make:entity

 Class name of the entity to create or update (e.g. AgreeableKangaroo):

> Page

 created: src/Entity/Page.php
 created: src/Repository/PageRepository.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):
 > Title

 Field type (enter ? to see all types) [string]:
 > string

 Field length [255]:
 > 

 Can this field be null in the database (nullable) (yes/no) [no]:
 > yes

 updated: src/Entity/Page.php

 Add another property? Enter the property name (or press  to stop adding fields):
 > content

 Field type (enter ? to see all types) [string]:
 > ?

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

  Field type (enter ? to see all types) [string]:
 > text

 Can this field be null in the database (nullable) (yes/no) [no]:
 > yes

 updated: src/Entity/Page.php

 Add another property? Enter the property name (or press  to stop adding fields):
 > 


           
  Success! 
           

A cóż to się dzieje w tej konsoli?! Dzieje się proces tworzenia klasy opisującej tabelkę. Ta klasa później będzie wykorzystywana do pozyskiwania i dodawania rekordów do bazy danych. W pierwszym zapytaniu program pyta się uprzejmie jak tylko może o nazwę klasy, która to w późniejszym czasie zostanie zamieniona w tabelkę umieszczoną w bazie danych.

W kolejnych zapytaniach tworzone są nowe i nowe pola klasy, dla których konieczne jest podanie nazwy oraz typu danych, jakie te pola przechowują. Znak zapytania ? jak widać wyświetla listę nie zliczonych (przynajmniej przeze mnie) opcji, jakimi można się posłużyć przy przypisywaniu typu pola tabelki.

Warto nadmienić, że klasa zostanie zapisana w folderze src/Entity pod wcześniej wybraną nazwą. Nie wnikając w szczegóły zawartości tegoż magicznego pliku można już z najdzikszą rozkoszą oddać się niezmiernej przyjemności utworzenia pierwszej tabelki. W tym celu w konsoli warto wpisać następujące polecenie:

php bin/console make:migration

Co spowoduje wyświetlenie komunikatu:

           
  Success! 
           

 Next: Review the new migration "src/Migrations/Version20190303154102.php"
 Then: Run the migration with php bin/console doctrine:migrations:migrate
 See https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html

teraz już tylko jedno polecenie dzieli nas od osiągnięcia celu:

php bin/console doctrine:migrations:migrate

Wynikiem czego będzie utworzenie upragnionej tabelki:

                                                              
                    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 20190303154102 from 0

  ++ migrating 20190303154102

     -> CREATE TABLE page (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(255) DEFAULT NULL, content LONGTEXT DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB

  ++ migrated (took 333.3ms, used 14M memory)

  ------------------------

  ++ finished in 335.5ms
  ++ used 14M memory
  ++ 1 migrations executed
  ++ 1 sql queries

Jak widać, utworzona została tabelka w bazie danych nic tylko się cieszyć i radować! Oczywiście nic nie stoi na przeszkodzie, aby ręcznie stworzyć pliki opisujące bazę danych i tylko wykonać migracje tworząc tym samym tabelki w bazie danych. Należy pamiętać, że każda migracja nadpisuje bazę danych czyli tworzy od nowa tabelki.

Propozycje książek