“Migration” ili migracija je naziv za proces u kojem preko CLI naredbe učitavamo datoteku migracije i po učitanim postavkama, stvaramo tablice/stupce u bazi podataka. Radi se o tome da kada prebacimo projekt na drugo računalo, možemo stvoriti cijeli kostur baze podataka sa CLI naredbom.

Pripremimo projekt

Da sad tu ne pišem iznova o tome kako pripremiti projekt, sve imate ovdje.

Da bi napravili datoteku migracije:

php spark make:migration main

S ovime dobivamo datoteku:

./app/Database/Migrations/2022-08-07-084359_Main.php

Sa sadržajem:

<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;

class Main extends Migration
{
    public function up()
    {
        //
    }

    public function down()
    {
        //
    }
}

S “up” metodom unosimo podatke u bazu a s “down” brišemo uneseno. “up” metoda sa unesenim podacima izgleda ovako:

public function up()
{
	$this->forge->addField([
		'id' => [
			'type' => 'INT',
			'constraint' => 5,
			'unsigned' => true,
			'auto_increment' => true,
		],
		'name' => [
			'type' => 'VARCHAR',
			'constraint' => '256',
			'null' => false
		],
		'updated_at' => [
			'type' => 'datetime',
			'null' => true,
		],
	'created_at datetime default current_timestamp',
	]);
	$this->forge->addPrimaryKey('id');
	$this->forge->createTable('products');
}

Nakon što smo unijeli podatke u “up” metodu u terminalu pokrećemo:

php spark migrate

…i sada vidimo da su tablica i stupci u bazi podataka:

Rollback

Ova naredba izvodi ono što se nalazi u “down” metodi datoteke migracije. Ovdje određujemo da ćemo obrisati “products” tablicu:

public function down()
{
	$this->forge->dropTable('products');
}

CLI naredba izgleda ovako:

php spark migrate:rollback

Više tablica u jednoj migraciji

Ako želimo imati više tablica u jednoj datoteci migracije, jednostavno ih dodamo jednu ispod druge u “up” odnosno “down” metodama.

public function up()
{
	$this->forge->addField([
	...
	$this->forge->createTable('products');
	
	$this->forge->addField([
	...
	$this->forge->createTable('users');
}

public function down()
{
	  $this->forge->dropTable('products');
      $this->forge->dropTable('users');
}

Strani ključevi

Naprimjer, želimo da nam “userId” stupac bude povezan sa “id” stupcem u “users” tablici.

$this->forge->addField([
...
	'userId' => [
		'type' => 'INT', 
		'unsigned' => true,
		'null' => false,
	],
...	
]);
...
$this->forge->addForeignKey('userId', 'users', 'id', 'CASCADE', 'CASCADE');  

Eto, kratko i nadam se, jasno.