বাংলায় PHP LARAVEL FRAMEWORK পর্ব-৮: LARAVEL Migrations

Laravel Framework এ Migration কি?

What is Laravel Migration

প্রযুক্তিগত অগ্রগতির সাথে সাথে , আমরা যারা আই.টি. পেশাদার, ওয়েব ডেভেলপার অথবা প্রোগ্রামার, আমরা অনেকেই ‘Database Schema’ নামটির সাথে পরিচিত এবং আমরা অনেকেই Database Schema কে create, modify এবং up-to-date রাখতে গিয়ে অনেক সমস্যার সম্মুখীন হই। আপনার Database কে up-to-data রাখা এবং সব জটিলতা সমাধান করার জন্য, Laravel Framework নিয়ে আসছে Migration সুবিধা। Laravel Framework এ Migration ফাইল গুলি /database/migrations ফোল্ডারে থাকে।

Laravel Framework এ, Migrations হচ্ছে আপনার Database Schema গুলোর যেকোনো গঠন পরিবর্তন করার জন্য একটি ফাইল-ভিত্তিক পদ্ধতি। আপনার Database এর Version Control System এর মতো। যা দিয়ে আপনার টিমকে অ্যাপ্লিকেশন গুলোর Database Schema কে সহজেই create, modify এবং share করার সুযোগ দিতে পারেন। এবং current schema কে up-to-date রাখতে পারেন। যেমন, আপনি আপনার Database এ table তৈরি এবং Drop করা, table এ নতুন column যোগ করা, আপডেট করা, মুছে ফেলা, table এ index যোগ করা সহ অন্যান্য কাজের জন্য Laravel Migration ব্যবহার করতে পারেন। পরবর্তীতে যেকোনো ভুলের জন্য অথবা যেকোনো পরিবর্তনের জন্যে আপনি খুব সহজে আগের অবস্থায় অথবা পিছনের যেকোনো ভার্সন এ ফিরে আসতে পারেন। কারণ প্রতিটি মাইগ্রেশন একটি টেক্সট ফাইলে সংরক্ষণ করা হয়, আপনি আপনার Project Repository তে রেখে তাদের পরিচালনা করতে পারেন। Laravel Framework এ Migrations সাধারণত Laravel এর schema builder সঙ্গে সংযুক্ত থাকে , যাতে সহজেই আপনার অ্যাপ্লিকেশন এর Database Schema তৈরী করতে পারেন।

ধরুন, আপনি এবং আপনার টীম git Version Control ব্যবহার করেন। হঠাৎ আপনার মনে হলো user টেবিল এ নতুন একটি ফিল্ড লাগবে যার নাম status এবং টাইপ হবে boolean । এখন আপনি Laravel Framework এর migration সুবিধা ব্যবহার করে টেবিলের পরিবর্তন টা করলেন ও git এ পাঠিয়ে দিলেন। এখন আপনার team এর অন্যান্য সদস্যরা চাইলে git merge করে Laravel migration ফাইলটি রান করে Database কে up-to-date করে নিতে পারেন। আগের মতো আর .sql ফাইল গুলো একজন আরেকজনের কাছ থেকে খুঁজে নিতে হবেনা ।

Migration নিয়ে কাজ করার পূর্বপ্রস্তুতি :

Laravel Framework এ Migration নিয়ে কাজ করতে হলে আপনাকে প্রথমে Database এর host এর সাথে connect এবং Database Select করতে হবে। আর এর জন্য আপনাকে আপনার project এর root ফোল্ডারের .env ফাইল এ Database এর host, username, password এবং Database name বলে দিতে হবে। নিচের ছবিটি লক্ষ্য করুন :

Laravel Database Connection in .env file-

Note: .env file edit করার পর অবশ্যই php artisan সার্ভার টি রিস্টার্ট দিতে হবে। অথবা “php artisan config:clear” এই command টি run করতে হবে।

কিভাবে Laravel Framework এ নতুন Migration File তৈরী করা হয় ?

Laravel Framework এ migration file তৈরী করতে হলে আপনাকে Terminal এ আপনার Project এর root এর ভেতর ঢুকে migration command রান করতে হবে। ধরুন, আমরা students table তৈরী করা জন্য একটা migration file বানাব। তাহলে আমাদের CLI তে artisan command টি হবে ঠিক নিচের মত:

php artisan make:migration create_students_table --create=students

এখন আপনি database/migrations ফোল্ডারে 2017_12_28_144409_create_students_table.php নামে নতুন তৈরী হওয়া একটা file দেখতে পাবেন। এবং ফাইলটি খুললে ঠিক নিচের মতো কোডগুলো পাবেন:

<?php
 
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
 
class CreateStudentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }
 
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('students');
    }
}

ব্যাখ্যা : প্রথমত এখানে schema, Blueprint ও Migration নামের তিনটি ক্লাসকে ব্যবহার করা হয়েছে। এবং Migration নামের ক্লাস কে extend করে CreateStudentsTable নামের একটি ক্লাস তৈরী করা হয়েছে। CreateStudentsTable class এ আমরা দুটি Method দেখতে পাই, একটি up অন্যটি down । up মেথড দিয়ে আমরা নতুন table তৈরী, table এ data insert, table এ নতুন field যোগ এবং অন্য যেকোনো পরিবর্তনও করতে পারি। আর down মেথড এ আমারা up মেথডে যে পরিবর্তন টা করেছি সেটা কিভাবে undo করা যায় সেই প্রসেসটা বলে দিতে পারি এবং table drop ও করে দিতে পারি। সাধারনত যেকোনো Table এ একটি id থাকা লাগে এবং table এর যেকোনো রেকর্ড কবে তৈরি ও পরিবর্তন হয়েছে সেইটাও জানতে হয়, তাই Laravel Framework আগেই আমাদের জন্য এই বেসিক বিষয় গুলো লিখে দিয়েছে। কিন্তু আমাদের প্রয়োজন না হলে এগুলো মুছে ফেলতে পারি।

Migration ব্যবহার করে Database এ নতুন Table তৈরি করা :

আমরা আমাদের students table টায় আরও কিছু ফিল্ড/কলাম(Column) যোগ করব। আর তার জন্য Laravel blueprint class এর $table object দিয়ে database table এর জন্য বিভিন্ন data type সহ $table object এর বিভিন্ন Method call করব। লাইন নম্বর ১৬ থেকে ২১ দেখুন :

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
 
class CreateStudentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 20);
            $table->string('email',50);
             $table->string('mobile',20);
            $table->tinyInteger('status')->default(1);
            $table->timestamps();
        });
    }
 
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('students');
    }
}

Note: Database table এ কলামগুলা তৈরি করার জন্য যে মেথড গুলো ব্যবহার করা হয়েছে সেগুলাকে বলে কলাম মেথড(Column methods)। নিম্নে আপনাদের সুবিধার্থে সবগুলো কলাম মেথড এর laravel.com থেকে copy করে দেওয়া হলো :

CommandDescription
$table->bigIncrements(‘id’);Auto-incrementing UNSIGNED BIGINT (primary key) equivalent column.
$table->bigInteger(‘votes’);BIGINT equivalent column.
$table->binary(‘data’);BLOB equivalent column.
$table->boolean(‘confirmed’);BOOLEAN equivalent column.
$table->char(‘name’, 100);CHAR equivalent column with an optional length.
$table->date(‘created_at’);DATE equivalent column.
$table->dateTime(‘created_at’);DATETIME equivalent column.
$table->dateTimeTz(‘created_at’);DATETIME (with timezone) equivalent column.
$table->decimal(‘amount’, 8, 2);DECIMAL equivalent column with a precision (total digits) and scale (decimal digits).
$table->double(‘amount’, 8, 2);DOUBLE equivalent column with a precision (total digits) and scale (decimal digits).
$table->enum(‘level’, [‘easy’, ‘hard’]);ENUM equivalent column.
$table->float(‘amount’, 8, 2);FLOAT equivalent column with a precision (total digits) and scale (decimal digits).
$table->geometry(‘positions’);GEOMETRY equivalent column.
$table->geometryCollection(‘positions’);GEOMETRYCOLLECTION equivalent column.
$table->increments(‘id’);Auto-incrementing UNSIGNED INTEGER (primary key) equivalent column.
$table->integer(‘votes’);INTEGER equivalent column.
$table->ipAddress(‘visitor’);IP address equivalent column.
$table->json(‘options’);JSON equivalent column.
$table->jsonb(‘options’);JSONB equivalent column.
$table->lineString(‘positions’);LINESTRING equivalent column.
$table->longText(‘description’);LONGTEXT equivalent column.
$table->macAddress(‘device’);MAC address equivalent column.
$table->mediumIncrements(‘id’);Auto-incrementing UNSIGNED MEDIUMINT (primary key) equivalent column.
$table->mediumInteger(‘votes’);MEDIUMINT equivalent column.
$table->mediumText(‘description’);MEDIUMTEXT equivalent column.
$table->morphs(‘taggable’);Adds taggable_id UNSIGNED INTEGER and taggable_type VARCHAR equivalent columns.
$table->multiLineString(‘positions’);MULTILINESTRING equivalent column.
$table->multiPoint(‘positions’);MULTIPOINT equivalent column.
$table->multiPolygon(‘positions’);MULTIPOLYGON equivalent column.
$table->nullableMorphs(‘taggable’);Adds nullable versions of morphs() columns.
$table->nullableTimestamps();Alias of timestamps() method.
$table->point(‘position’);POINT equivalent column.
$table->polygon(‘positions’);POLYGON equivalent column.
$table->rememberToken();Adds a nullable remember_token VARCHAR(100) equivalent column.
$table->smallIncrements(‘id’);Auto-incrementing UNSIGNED SMALLINT (primary key) equivalent column.
$table->smallInteger(‘votes’);SMALLINT equivalent column.
$table->softDeletes();Adds a nullable deleted_at TIMESTAMP equivalent column for soft deletes.
$table->softDeletesTz();Adds a nullable deleted_at TIMESTAMP (with timezone) equivalent column for soft deletes.
$table->string(‘name’, 100);VARCHAR equivalent column with a optional length.
$table->text(‘description’);TEXT equivalent column.
$table->time(‘sunrise’);TIME equivalent column.
$table->timeTz(‘sunrise’);TIME (with timezone) equivalent column.
$table->timestamp(‘added_on’);TIMESTAMP equivalent column.
$table->timestampTz(‘added_on’);TIMESTAMP (with timezone) equivalent column.
$table->timestamps();Adds nullable created_at and updated_atTIMESTAMP equivalent columns.
$table->timestampsTz();Adds nullable created_at and updated_atTIMESTAMP (with timezone) equivalent columns.
$table->tinyIncrements(‘id’);Auto-incrementing UNSIGNED TINYINT (primary key) equivalent column.
$table->tinyInteger(‘votes’);TINYINT equivalent column.
$table->unsignedBigInteger(‘votes’);UNSIGNED BIGINT equivalent column.
$table->unsignedDecimal(‘amount’, 8, 2);UNSIGNED DECIMAL equivalent column with a precision (total digits) and scale (decimal digits).
$table->unsignedInteger(‘votes’);UNSIGNED INTEGER equivalent column.
$table->unsignedMediumInteger(‘votes’);UNSIGNED MEDIUMINT equivalent column.
$table->unsignedSmallInteger(‘votes’);UNSIGNED SMALLINT equivalent column.
$table->unsignedTinyInteger(‘votes’);UNSIGNED TINYINT equivalent column.
$table->uuid(‘id’);UUID equivalent column.
$table->year(‘birth_year’);YEAR equivalent column.

এবার আমাদের বানানো এবং আগে থাকা(যদি থাকে) Migration গুলোকে দিয়ে আমরা আমাদের Database এ table গুলি বানিয়ে ফেলি। চলুন Terminal এ নিচের কমান্ডটি রান করি :

php artisan migrate

এখন আপনি আপনার Database টি দেখুন। এখানে আমাদের students table ছাড়াও আরও একটি টেবিল আছে যার নাম migrations. এটি লারাভেল নিজে ব্যবহার করে। নিচে আমাদের phpmyadmin screenshot result দেওয়া হলো:

Laravel Migration Table

মাইগ্রেশনটি rollback বা undo করা:

কখনো আমরা আমাদের database এর আগের অবস্থানে যেতে হতে পারে , ধরুন আপনি একটা Migration run করার পর আপনার মনে হলোঃ আপনার যেকোনো একটি column নামের বানান ভুল হয়েছে বা আরও একটি ফিল্ড add করতে হবে তখন আবার নতুন মাইগ্রেশন না লিখে rollback আপনি rollback করতে পারেন, তারপর আপনি আপনার মাইগ্রেশনটাকে প্রয়োজন মতো লিখে আবার মাইগ্রেট কমান্ড রান করতে পারবেন। আর এর জন্য আপনাকে নিচের command টি রান করতে হবে :

php artisan migrate:rollback

এখন আপনি আপনার table টা আর database এ দেখতে পাবেন না, অর্থাৎ , Larvel আপনার সর্বশেষ করা students table রিমুভ করে দিবে। এবং Laravel তার নিজস্ব table migrations টি রেখে দিবে।

Note:আপনার কোনও মাইগ্রেশনে যদি Rename অথবা Drop থাকে তাহলে উপরের command টি error দিবে। এই জন্য, doctrine/dbal নামক একটি প্যাকেজ আপনার প্রোজেক্ট এ যোগ করতে হবে। Terminal এ শুধু নিচের কমান্ডটি রান করুনঃ

composer require doctrine/dbal

এটা আমাদের সব প্যাকেজ গুলোকে update, প্রয়োজনে add করে নিবে।

Migration ব্যবহার করে সব টেবিল গুলো মুছে ফেলা :

Laravel Framework এ Migration ব্যবহার করে সব table মুছে ফেলতে চাইলে আপনি নিচের কমান্ডটি রান করাই করতে পারেন :

php artisan migrate:reset

এখন পুরা ডাটাবেজ ক্লিয়ার হয়ে যাবে এবং আবার যদি মাইগ্রেট কমান্ড রান করাই তাহলে একে বারে ফ্রেশ একটি ডাটাবেজ পাবো।

একবারে সব টেবিল মুছে ফেলে নতুন করেতৈরি

একবারে সব টেবিল মুছে ফেলে নতুন করে তৈরি করতে চাইলে আপনি নিচের কমান্ডটি রান করাই করতে পারেন :

php artisan migrate:refresh

এখন আপনাকে ঠিক নিচের মত রেজাল্ট দেখাবে :

Leave A Reply

Your email address will not be published. Required fields are marked *