W niniejszej części szkoleniowej mam zamiar omówić tak zwane migracje. W następnych częściach szkolenia zapiszę i odczytam przykładowe informacje z tabeli bazy danych za pomocą narzędzi Laravel i zaprezentuję sposoby przekazywania danych z bazy danych do widoków. Gdy już wyjaśnię pojęcia związane z Modelami, pokażę jak pracować z danymi z poziomu klasy korzystając w metod Eloquent'a.
Laravel udostępnia sporą ilość sterowników do rozmaitych baz danych, a także daje możliwość pracy z własnymi sterownikami. Aby zapoznać się z obsługiwanymi sterownikami warto zajrzeć do pliku config/database.php
Baza danych, użytkownik i uprawnienia
Przed rozpoczęciem pracy z bazą danych MySQL należy utworzyć nową bazę danych, utworzyć użytkownika i nadać mu odpowiednie uprawnienia. Zakładam, że osoby zainteresowane nauką Laravel generalnie wiedzą jak to zrobić. Tym wszystkim, którzy jednak nie mają pojęcia jak się za to zabrać, ułatwię nieco sprawę i opiszę jak to wykonać z poziomu klienta MySQL.
Zakładając, że baza danych ma się nazywać nauka, nazwa użytkownika ma brzmieć bob, natomiast hasło to glasses-101, procedura może wyglądać przykładowo następująco:
MariaDB [(none)]> create database nauka;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant usage on *.* to 'bob'@'localhost' identified by 'glasses-101';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant all on nauka.* to 'bob'@'localhost';
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant usage on *.* to 'bob'@'localhost' identified by 'glasses-101';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> grant all on nauka.* to 'bob'@'localhost';
Query OK, 0 rows affected (0.00 sec)
Praca z bazą danych w Laravel
Plik znajdujący się w głównym katalogu aplikacji, noszący nazwę .env zawiera zbiór ważnych ustawień, a między innymi, ustawienia związane z dostępem do bazy danych z poziomu aplikacji Laravel.
Aby umożliwić dostęp do wcześniej utworzonej bazy danych z poziomu Laravel, ustawienia bazodanowe w pliku .env powinny wyglądać następująco:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nauka
DB_USERNAME=bob
DB_PASSWORD=glasses-101
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nauka
DB_USERNAME=bob
DB_PASSWORD=glasses-101
W przypadku konieczności można oczywiście podać prawidłowy port oraz odpowiedni adres IP hosta.
Plik .env |
Laravel 5.4 specified key was too long error
Uwaga! W przypadku Laravel 5.4, aby operacje bazodanowe działały prawidłowo, plik
app/Providers/AppServiceProvider.php
powinien zawierać wstępnie następującą treść:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Schema::defaultStringLength(191);
}
public function register()
{
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Schema::defaultStringLength(191);
}
public function register()
{
}
}
Jeśli powyższe zmiany nie zostaną wprowadzone, jakakolwiek próba wykonania operacji na bazach danych spowoduje wyświetlenie następującego komunikatu o błędzie:
[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
PHP artisan
Do utworzenia tabeli MySQL posłużę się dedykowanymi narzędziami frameworka Laravel. Aby wygenerować skrypt tworzący tabelę bazy danych można skorzystać z php artisan. Czym jest php artisan? Otóż jest to specjalny zestaw poleceń, którym można się posługiwać w celu wykonania bardzo rozmaitych czynności. Aby wstępnie zapoznać się z funkcjami php artisan można wydać następujące polecenie z poziomu głównego katalogu aplikacji:
php artisan list
Powyższe polecenie wyświetli całą listę funkcji oferowanych przez interfejs php artisan. Kilka słów o migracjach
W Laravel pod pojęciem migracji kryją się operacje bazodanowe, takie jak tworzenie i usuwanie tabeli, usuwanie istniejących i ponowne tworzenie czystych tabeli, przywracanie konkretnej wersji struktury bazy danych, czyli konkretnej wersji migracji.
Migracje są jak pewien rodzaj kontroli wersji bazy danych, dzięki czemu zespół programistów może łatwo modyfikować i udostępniać schemat bazy danych aplikacji. Migracje są zazwyczaj sparowane z narzędziem do tworzenia schematów Laravel, aby łatwo budować schemat bazy danych aplikacji.
Przed utworzeniem nowych tabeli należy wygenerować specjalny, służący do tego zadania skrypt migracyjny, który generowany jest wedle ustalonego schematu Laravel.
Więcej informacji o migracjach można znaleźć w oficjalnej dokumentacji Laravel.
Za każdym razem gdy wykonywane jest polecenie
php artisan migrate
Laravel uruchamia wszystkie skrypty migracyjne, które znajdują się w katalogu
database/migrations
Po świeżej instalacji Laravel w wersji 5.4 w katalogu tym powinny się znajdować 2 skrypty migracyjne:
2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
Skrypty te mają za zadanie utworzenie struktury tabel users i password_resets, związanych z uwierzytelnianiem. Uwierzytelnianie to jeden z tematów, które mam zamiar opisać w kolejnych częściach niniejszego tutorialu. 2014_10_12_100000_create_password_resets_table.php
Tworzymy skrypt migracyjny
Jeśli wykonaliśmy już wszystkie wstępne czynności konfiguracyjne, które opisałem wcześniej i które są związane z umożliwieniem dostępu do bazy danych skryptom Laravel, możemy teraz wydać, z poziomu katalogu głównego naszej aplikacji, następujące polecenie, które ma za zadanie utworzyć skrypty migracyjne służące do wygenerowania tabeli o przykładowej nazwie 'posts':
php artisan make:migration create_posts_table
Zakładając, że wykonanie skryptu się powiodło, w katalogu skryptów migracyjnych, o którym pisałem wyżej, powinien widnieć nowy skrypt o nazwie podobnej do:
2017_11_25_195109_create_posts_table.php
Jeśłi otworzymy ten plik w naszym ulubionym edytorze, zobaczymy następującą treść:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
}
Osoby mające doświadczenie z SQL na pewno zrozumieją znaczenie tego kodu. Jednak nasza szkoleniowa tabela posts, która docelowo będzie zawierała posty, oprócz samego identyfikatora id i kolumn związanych z czasem utworzenia oraz aktualizacji wierszy, powinna posiadać dodatkowe kolumny, takie jak ciało (czyli treść) i tytuł. W tym celu należy zmodyfikować funkcję up(), czyli metodę tworzącą tabelę, w następujący sposób:
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
}
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->timestamps();
});
}
Warto tutaj oczywiście zapoznać się z funkcjami i możliwościami frameworka Laravel związanymi z określaniem typu kolumn
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->timestamps();
});
}
Uruchomienie migracji i utworzenie nowych tabel
Wydajmy teraz z poziomu głównego katalogu aplikacji polecenie, które ma za zadanie wykonanie istniejących skryptów migracyjnych:
php artisan migrate
Po uruchomieniu migracji powinny się wyświetlić informacje o pomyślnym wykonaniu skryptów:
Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t. Tabele bazodanowe i dynamiczne widoki
Składanie comiesięczne deklaracji intrastat, bywa bardzo kłopotliwe. Jeżeli ktoś obraca dużą ilością towarów to problem się nawarstwia. Jak dla mnie ważne aby posiadać u siebie w firmię osobe, która kompetentnie podejdzie do tego temu i zapewni nam spokój.
OdpowiedzUsuń