12 database in laravel

Tutte le configurazioni riguardanti il database possono essere inserite nel file .env nella root della nostra app. In realtà questo file viene richiamato a sua volta dal file database.php dentro la cartella config dove è possibile specificare altre opzioni aggiuntive.

Creiamo quindi un database con mySQL usando il metodo che preferiamo e mettiamo i parametri di connessione nel file.env.

migrazioni

Le migrazioni sono una procedura che ci permette di versionare le modifiche fatte ad un database. Grazie ad esse possiamo gestire la struttura del database come creare, modificare eliminare le tabelle.

Il file incaricato per creare utenti e tabelle si trova nella cartella database/migrations e corrisponde al nome create_users_table.php preceduto da una serie di numeri corrispondenti a una data.

Dentro questo file troviamo i 2 metodi più importanti: up() e down() per creare o distruggere tabelle.

Per avviare le migrazioni sarà sufficiente lanciare il comando migrate da terminale

php artisan migrate

Questo comando leggerà i dati dai file in database/migrations e genererà le tabelle e i campi inseriti nei metodi up() o down() e scriverà i dati nel database tramite la funzione blueprint. Questi metodi utilizzano altri metodi dell’oggetto $table come

public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');

Crea un campo id, crea un campo di tipo stringa che si chiama name.

Ovviamente l’obbiettivo è quello di creare le nostre migrazioni personalizzate per aggiungere i campi che ci servono. Per creare la nostra migration personalizzata usiamo il comando make:migration

php artisan make:migration create_album_table --create=albums

il comando crea una nuova migrazione chiamata create_album_table e tramite l’opzione –create imposta dentro il file la regola per la creazione della tabella chiamata albums.

Di default nella nuova migrazione vengono inseriti sia la creazione del campo id che è la chiave univoca della tabella, sia il timestamps che permette di memorizzare le creazioni e le modifiche dei records

public function up()
{
 Schema::create('albums', function (Blueprint $table) {
  $table->id();
  $table->timestamps();
 });
}

Per aggiungere altri campi con le relative opzioni personalizzate e per consultare i tipi, basta riferirci alla documentazione ufficiale di laravel, sotto la voce database migrations troveremo la parte riferita alla creazione delle tabelle e nella sezione columns tutti gli esempi che soddisfano ogni richiesta di tipo e opzioni dei campi della tabella.

Infatti ritroviamo il nostro id

$table->id();

ma subito dopo troviamo la foreignkey che sarà di tipo unsignedBigInteger

$table->foreignId('user_id');

Qui troviamo ogni tipo di colonna supportata in SQL .

Andiamo ad aggiungere i campi che ci servono alla nostra migrazione create_album_table

$table->id();
$table->string('album_name',128)->unique();
$table->timestamps();

abbiamo aggiunto il campo di tipo stringa album_name di lunghezza 128 caratteri, unique perchè il nome lo vogliamo unico e non lo vogliamo nullo.

Aggiungiamo altre colonne

$table->id();
$table->string('album_name',128)->unique();
$table->string('album_thumb');
$table->text('descriprion')->nullable();
$table->foreignId('user_id');
$table->timestamps();

da notare la colonna di tipo text description a cui possiamo il parametro nullable per indicare che il campo può essere anche nullo.

Se volessimo registrare anche il timestamps delle cancellazioni, aggiungiamo il campo softDeletes che di default usa il valore deleted_at

$table->softDeletes();

a questo punto possiamo lanciare nuovamente la migrazione, ma utilizziamo l’opzione fresh che effettuerà il drop di tutte le tabelle per ricrearle aggiornate. Questa opzione è utile in fase iniziale quando stiamo costruendo la struttura del database. Fare attenzione, se sono presenti già dei dati su un database popolato, questa opzione CANCELLERA’ TUTTI I DATI

php artisan migrate:fresh
Piccola nota per plesk

Se ricevessimo errori durante il migrations per versioni dovute a campi che non rispettano le lunghezze o errori per versioni di database mySQL o MariaDB, modificare il provider AppServiceProvider.php in app/Providers aggiungedo l’uso del facede Schema e aggiungendo Schema::defaultStringLength(191); alla funzione boot()

use Illuminate\Support\Facades\Schema;

public function boot() {
 Schema::defaultStringLength(191);
}

Creiamo ora una migrazione create_photos_table per aggiungere la tabella photos

php artisan make:migration create_photos_table --create=photos

Foreign keys

La Foreign keys è una chiave esterna che permette relazioni tra tabelle, permettendo di identificare un campo di una tabella (chiamata referenziante) da altre tabelle (chiamate referenziate).

Nella tabella albums avevamo preparato la colonna di tipo foreignId

$table->foreignId('user_id');

Ora dobbiamo aggiungere la Foreign keys indicando da dove far riferimento al dato

$table->foreign('user_id')->on('users')->references('id');

Con questo codice diciamo che la colonna di tipo foreign key user_id deve collegarsi ( on ) alla tabella users e fare riferimento alla colonna id.

Possiamo anche aggiungere il comportamento da eseguire alla cancellazione dell’album se l’utente viene cancellato con onDelete cascade

$table->foreign('user_id')->on('users')->references('id')
->onDelete('cascade');

Non specificando tale opzione la foreign key viene invalidata.

Completiamo tutti i campi della tabella photos aggiungendo la foreign key album_id collegata al campi id della tabella albums

Schema::create('photos', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->softDeletes();
$table->string('name',128);
$table->text('description')->nullable();
$table->string('img_path');
$table->foreignId('album_id');
$table->foreign('album_id')->on('albums')->references('id')
->onDelete('cascade');
});

modificare una migrazione

Se volessimo apportare delle modifiche alla tabella, che so, modificare un nome, dovremmo creare comunque una nuova migrazione con make:migration, assegnare un nome e come opzione –table= e specificare il nome della tabella da aggiornare

php artisan make:migration update_column_name --table=albums

Ora andiamo ad inserire nella migrazione update_column_name il campo da aggiornare, diamogli una lunghezza di 191caratteri per verificare l’update. Il cambiamento verrà eseguito grazie al metodo ->change()

Schema::table('albums', function (Blueprint $table) {
 $table->string('album_name',191)->change();
}

Ora rilanciamo la migrazione, dando semplicemente migrate prenderà solo le modifiche

php artisan migrate

Qualora la procedura di update non andasse a buon fine bisognerà installare il pacchetto doctrine dbal

composer require doctrine/dbal