লারাভেল – কোয়েরি বিল্ডার

লারাভেল এবং ডেটাবেজ লেখাতে আমরা জেনেছি কিভাবে ডেটাবেজ কানেক্ট করা যায়। কিভাবে php artisan migrate এর মাধ্যমে স্কিমা থেকে ডেটাবেজে টেবিল যুক্ত করা যায় ইত্যাদি। এবার আমরা আমাদের নিজেদের স্কিমা তৈরি করব। ডেটাবেজ স্কিমা গুলো থাকে project>Database>Migrations ফোল্ডারের ভেতর।

এখানে গিয়ে যদি আমরা …user_table ফাইলটি দেখি, তাহলে দেখব এর ভেতর কিছু কোড লেখা রয়েছে। User টেবিল কেমন হবে, তা এখানে লেখা রয়েছে। আমরা একটা টেবিল স্কিমা তৈরি করতে চাইলে migration এর হেল্প নিতে পারি। যা আমাদের টেবিল স্কিমা এর বয়লারপ্লেট যুক্ত করে দিবে। তার জন্যঃ

php artisan make:migration table_name --create=name

যেমন আমরা task নামে একটা টেবিল তৈরি করব। তার জন্য কমান্ড লাইনে লিখবঃ

php artisan make:migration create_tasks_table --create=tasks

এখন যদি project>Database>Migrations ফোল্ডারটি দেখি, তাহলে দেখব create_tasks_table নামক একটা ফাইল তৈরি হয়েছে। যার ভেতর কিছু কোড ও রয়েছে। যা দেখতে এমনঃ

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTasksTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->increments('id');      
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tasks');
    }
}

এখানে যদি দেখি, দুইটা প্রধান মেথড রয়েছে। একটা হচ্ছে up আরেকটা হচ্ছে down. up এর কাজ হচ্ছে যখন আমরা migration কমান্ড দিব, তখন টেবিল ক্রিয়েট করবে এই স্কিমা অনুযায়ী। আর down কাজ করবে যখন আমরা কোন টেবিল ড্রপ করতে চাইবো। ডিফল্ট ভাবে টেবিলে দুইটা ফিল্ড যুক্ত হয়েছে। একটা হচ্ছে id আরেকটা হচ্ছে time. আমরা Task টেবিলে আরেকটা নতুন ফিল্ড যুক্ত করব, যেমন body বা টাস্ক সম্পর্কে বিস্তারিত রাখার জন্য একটা ফিল্ড।

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

এখানে text হচ্ছে কি টাইপের ডেটা রাখব, তা। এখন যদি ডেটাবেজ দেখি আমরা phpMyAdmin বা অন্য কোন ভাবে, তাহলে দেখব Task নামে এখনো কোন টেবিল তৈরি হয় নি। Task টেবিল তৈরি করার জন্য কমান্ড লাইনে গিয়ে লিখব php artisan migrate তাহলে টেবিলটি তৈরি হবে। phpMyAdmin বা যেকোন ভাবে আমাদের ডেটাবেজ দেখলে আমরা দেখব Task নামক একটি টেবিল তৈরি হয়েছে। এবং যার মধ্যে চারটি ফিল্ড যুক্ত হয়েছে। চারটি ফিল্ডের কারণ হচ্ছে timestamps এর দুইটি ফিল্ড। একটা আইডি আরেকটা হচ্ছে body, যা আমরা যুক্ত করেছি।

আমরা যদি নতুন কোন ফিল্ড যুক্ত করতে চাই আমাদের টেবিলে, তাহলে create_tasks_table ফাইলে ফিল্ডটি যুক্ত করবঃ

    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->increments('id');
            $table->text('body');
            $table->text('title');
            $table->timestamps();
        });
    }

এবং কমান্ড লাইনে লিখবঃ php artisan migrate:refresh

কোয়েরি করার জন্য আমরা প্রথমে ম্যানুয়ালি Task টেবিলে কিছু ডেটা যুক্ত করব। phpMyAdmin এ ম্যানুয়ালি ডেটা Insert এর মাধ্যমে যুক্ত করা যাবেঃ

ম্যাক ব্যবহারকারীরা sequelpro.com দেখতে পারেন।

ডেটাবেজ থেকে ডেটা কোয়েরি করে আমরা ভিউতে দেখাবো। তার জন্য Routes ফাইলে আমরা কোয়েরি করবঃ

Route::get('/', function () {
    $tasks =  DB::table('tasks')->get();
    return view('welcome' , compact('tasks'));
});

ডেটা কোয়েরী করে ভিউতে সব গুলো ডেটা পাস করেছে। ভিউতে তা দেখানোর জন্যঃ

<ul>
<?php foreach ($tasks as $task):  ?>
    <li><?php echo $task->body; ?></li>
<?php endforeach; ?> 
</ul>

এখন যদি আমরা প্রজেক্টটি ব্রাউজারে দেখি, তাহলে দেখব ডেটাবেজ থেকে ডেটা দেখাচ্ছে। আমরা চাইলে নতুন ডেটা যুক্ত করে দেখতে পারি।

এটাকে আরেকটু ডাইনামিক করি। আমরা তো প্রথম পেইজে সব গুলো টাস্ক এর লিস্ট দেখাচ্ছি। আমরা চাচ্ছি যখন কেউ যে কোন একটা টাস্কে ক্লিক করবে, তখন তা নতুন আরেকটা পেইজে ওপেন হবে এবং ঐ টাস্ক সম্পর্কে বিস্তারিত দেখাবে। তার জন্য প্রথমে ভিউতে লিঙ্ক যুক্ত করতে হবেঃ

<ul>
<?php foreach ($tasks as $task):  ?>
    <li><a href="<?php echo $task->id; ?>"> <?php echo $task->body; ?></a></li>
<?php endforeach; ?> 
</ul>

এখানে আমরা শুধু লিঙ্ক যুক্ত করেছি। যা হচ্ছে ঐ টাস্কের ID। এখন যদি কেউ কোন টাস্কে ক্লিক তাহলে এভাবে নতুন একটা পেইজে যাবেঃ example.com/id (যে কোন id যেমন 1..2..3)

নতুন পেইজে গেলে কি দেখাবে, তা আমরা বলে দিতে হবে। তার জন্য প্রথমে একটা রাউটস তৈরি করতে হবেঃ

Route::get('/{id}', function ($id) {	
 	$task =  DB::table('tasks')->find($id); 

    return view('task' , compact('task'));
});

এখন কেউ যদি example.com/1 এ ভিজিট করে, তাহলে Task id 1 এর ডেটা কোয়েরি করে task নামক ভিউতে ঐ ডেটা পাস করবে নামে। আমরা view ফোল্ডারে task.php ফাইল নামক একটা ফাইল তৈরি করব। এবং ভিউতে পরে task এর ডেটা গুলো দেখাবোঃ

<p>Task ID: <?php echo $task->id; ?> </p>
<p>Task body: <?php echo $task->body; ?> </p>
<p>Created at:  <?php echo $task->created_at; ?> </p>
<p>Updated at:  <?php echo $task->updated_at; ?> </p>
 

আমরা ডাইনামিক একটা প্রজেক্ট তৈরি করে ফেলেছি। well, almost dynamic! 😀

Leave a Reply