domenica 25 novembre 2018

Gestione Database - Parte 1

Anche Laravel gestisce il database tramite ORM e migrazioni.

Quando installate Laravel da Composer, drovrete lanciare la prima migrazione che creerà la tabella users e reset password.

Per impostare i dati di connessione al database, dovete aprire il file database.php dentro config.

A questo punto da linea di comando, lanciate:

php artisan:migrate


A questo punto potete creare le vostre tabelle su database e creare la migrazione sulla base di esse. Per farlo, una volta creata la tabella, sempre da linea di comando lanciate:

php artisan make:migration -h

per avere un elenco dei comandi.

A questo punto lanciate il comando seguente per creare una migrazione per una ipotetica tabella people.

php artisan make:migration create_people_table --create people

Laravel creerà una migrazione tendenzialmente vuota con solo l'ID auto-incremento ed un timestamp.

A questo punto potete aggiungere le vostre colonne nella migrazione seguendo questa guida:

https://laravel.com/docs/5.7/migrations#creating-tables

Dove sono indicate le tipologie di colonne che solitamente sono 1:1 con i nomi di mysql.

IMPORTANTE: La migrazione base create da Laravel, inserisce la tipologia timestamps che creerà di default due colonne timestamp chiamate created_at e updated_at, utili a tenere traccia delle modifiche (Laravel lo farà automaticamente quando useremo i suoi ORM).
Se dovete tenere traccia anche delle cancellazioni logiche, allora dovete inserire:

$table->softDeletes();

Per creare foreign key su altre tabelle, basta creare la colonna adibita normalmente e poi assegnarvi una foreign key.



 Schema::create('people_power', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->on('users')->references('id')
                  ->onDelete('cascade')->onUpdate('cascade');
            $table->integer('power_id')->unsigned();
            $table->foreign('power_id')->on('power')->references('id')
                  ->onDelete('cascade')->onUpdate('cascade');
            $table->timestamps();
        });

Nell'esempio avevamo creato precedentemente una tabella Power tramite migrazione ed abbiamo creato questa tabella aggiuntiva per avere una relazione N:N tra Power e People.
Come si vede, abbiamo creato prima le due colonne di collegamento e su ognuna abbiamo applicato la foreign key.

Modifica

Per modificare una tabella per aggiungere colonne, togliere colonne, cambiare le specifiche di una colonna, occorre creare una migrazione apposita.
Questa volta però senza l'opzione create ma tramite l'opzione table.

php artisan make:migration update_table_people_name --table people


Questo creerà una migrazione vuota.
A questo punto basterà riempire i due metodi up e down per specificare l'entità della modifica e cosa fare in caso di rollback.
Come si evince, in questa migrazione stiamo cambiando la dimensione di una colonna che già esisteva (name) e stiamo aggiungendo 6 nuove colonne utilizzando la stessa sintassi che si usa quando si creano.

Nella down invece stiamo rimettendo la dimensione della colonna name a quella originale e stiamo droppando le colonne che avevamo aggiunto.
ATTENZIONE: Se non droppato le colonne, queste rimarranno su DB ed una successiva migrazione dello stesso file, vi darà errore perché Laravel tenterebbe di creare le sei nuove colonne che però sono già su DB.


 public function up()
    {
        Schema::table('people', function (Blueprint $table) {
            $table->string('name',300)->change();
            $table->tinyInteger('strength');
            $table->tinyInteger('dexterity');
            $table->tinyInteger('constitution');
            $table->tinyInteger('inteligence');
            $table->tinyInteger('wisdom');
            $table->tinyInteger('charisma');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('people', function (Blueprint $table) {
            $table->string('name',250)->change();
            $table->dropColumn('strength');
            $table->dropColumn('dexterity');
            $table->dropColumn('constitution');
            $table->dropColumn('inteligence');
            $table->dropColumn('wisdom');
            $table->dropColumn('charisma');
        });
    }

Nessun commento:

Posta un commento