فصل ۹-۱: آشنایی با دستورهای Migration و انواع داده MySQL در لاراول

06 آبان 1397
درسنامه درس 10 از سری لاراول
Laravel-Main-datatype

پس از مبحث View و Controller باید وارد یک فضای جدید از معماری سه لایه‌ی MVC شویم که نام آن Model‌ است. قبل از مطرح کردن بحث مدل‌ها شما باید با نحوه‌ی ارتباط با دیتابیس (Database) و مهاجرت (Migration) آشنا شوید. سپس از یک ابزار بسیار کاربردی تحت عنوان Tiker پرده برداشته و به قدرتهای این فریم ورک بی نظیر پی ببرید. با ما همراه باشید

مقدمه

اگر به مباحث قبلی توجه داشته باشید، نقص نرم‌افزار و اپلیکیشن شما مشخص خواهد شد. درست حدس زدید! نرم‌افزار شما داده‌های ارسالی و دریافتی را از کدام منبع اتخاذ می‌کند؟ هیچ منبعی در مباحث قبلی برای ذخیره سازی اطلاعات وجود نداشت. لذا همواره برای تمام اپلیکیشن‌های سطح بالا همواره باید منبعی با نام «دیتابیس یا پایگاه داده» وجود داشته باشد که اطلاعات نرم‌افزار شما اعم از درخواست کاربران، ورودی‌ها و ... در آن ذخیره شود. قبل از شروع هر کاری قطعا شما باید دیتابیس خود را تنظیم کرده و آن را به اپلیکیشن خود معرفی کنید در صورتیکه این کارها را انجام نداده‌اید حتما پست زیر را مطالعه بفرمایید:

پس از انجام تنظیمات دیتابیس و اطمینان از اتصال آن با لاراول باید با مبحثی به نام Migration یا مهاجرت آشنا شوید.

Migration چیست؟

Migration‌ در لغت به مهنای مهاجرت است. Migration به مجموعه‌ی فایل‌های درون پوشه‌ی database/migrations گفته می‌شود که با مهفوم دقیق‌تر می‌توان آن را کنترلری برای دیتابیس نامید. همچنین Migration کلاسی است که هر اکشن آن عملیاتی برای تبدیل دستورها به عبارت‌های قابل فهم برای پایگاه داده انجام می‌دهد. اما مهم‌ترین نکته و اتفاق در لاراول این است که این Migration در دستورات Artisan قابل دسترس می‌باشد و با نوشتن یک خط دستور می‌توان یک جدول ایجاد، حذف و یا به پایگاه داده انتقال داد.

از Migration‌ برای ساخت جداول و ستون‌ها استفاده می‌شود. هر دیتابیس همانطور که مطلع هستید چیزی جز مجموعه‌ای از جداول (tables) و ستون‌ها (columns) نیست. با استفاده از دستور زیر می‌توانید راهنمای Migration را در Artisan مطالعه کنید:

php artisan help make:migration

این دستور تمام گزینه‌هایی (Options) که می‌توانید هنگام ساخت یک Migration در اختیار داشته باشید، معرفی می‌کند. مهم‌ترین گزینه‌ها در Migration عبارتند از create و table که در ذیل به توضیح دقیق آنها می‌پردازیم:

ایجاد یک فایل در پوشه‌ی database/migrations جهت ساخت جدولی با نام posts، به صورت زیر می‌باشد:

php artisan make:migration create_posts_table --create=posts

با مشاهده دستور بالا متوجه خواهید شد که عبارت اول یعنی create_posts_table نام فایل ذخیره شده در پوشه‌ی database/migrations و عبارت create=posts-- جدولی‌ست که پس از انتقال یا migrate کردن فایل در دیتابیس ساخته خواهد شد.

توجه: در ابتدای هر فایل موجود در پوشه‌‌ی database/migrations عددی قرار گرفته است که نشان‌دهنده‌ی ساعت و تاریخ ساخت فایل است و به صورت خودکار به نام فایل اضافه می‌شود تا از کپی‌شدن فایل‌ها روی یکدیگر جلوگیری کند. همچنین این اعداد به Migration اطلاع می‌دهند که ترتیب و نظم انتقال داده‌ها به دیتابیس به چه صورت باشد (یعنی ابتدا کدام یک از فایل‌ها در دیتابیس ایجاد شوند).

ایجاد یک فایل در پوشه‌ی database/migrations جهت اضافه یا ویرایش کردن یک جدول (table) با نام posts، به صورت زیر می‌باشد:

php artisan make:migration add_votes_to_posts_table --table=posts

با این دستور یک فایل با نام add_votes_to_posts_table در پوشه‌ی database/migrations ایجاد شده و اختیارات کامل را برای تغییر و یا ویرایش جدول posts، فراهم می‌کند.

پس از فراگرفتن دستورهای فوق به بررسی نحوه‌ی ساخت جداول درون فایل‌ها می‌پردازیم.

ساخت جداول

پس از اعمال دستور create=posts-- جدولی با نام دلخواه درون پوشه‌ی database/migrations ایجاد شده است که محتویات این فایل به صورت زیر است:

<?php

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

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

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

همانطور که در ابتدا مشاهده می‌کنید یک سری کلاس‌ها در ابتدای این فایل فراخوانی شده‌اند و سپس نام کلاس قرار داده شده که از کلاس Migration ارث‌بری (extend) کرده است. سپس دو تابع با نام‌های up و down‌ مشاهده می‌کنید که در ابتدا و انتهای این کلاس قرار دارد. این دو متد به صورت زیر تعریف می‌شوند:

متد ()up

هنگامیکه عملیات migrate یا مهاجرت اطلاعات به دیتابیس و پایگاه داده صورت می‌گیرد این متد درگیر شده و در واقع اطلاعات به برای دیتابیس ارسال می‌کند (یا جدولی می‌سازد یا جدولی را ویرایش می‌کند)

متد ()down

هنگامیکه عملیات roll back یا بازگشت به عقب صورت می‌گیرد این متد درگیر شده و migration را به یک یا چند مرحله قبل برده و اجرا می‌کند تا فایل به حالت گذشته بازگردد.

تعریف ساده‌تر از up و down:‌ عملیات up مانند do (انجام دادن) و عملیات down مانند undo (باز گرداندن تغییرات) است.

قبل از ورود به محتویات درون این متدها لازم به ذکر می‌دونم شما عزیزان رو حتما و حتما به مطالعه‌ی انواع داده‌های موجود در پایگاه‌داده‌ی MySql دعوت کنم. توجه داشته باشید که بدون مطالعه‌ی این مقاله، همواره در انتخاب نوع داده‌های خود سردرگم هستید:

حال که مطلب فوق را مطالعه کردید به معرفی انواع داده در لاراول و معادل‌های هر نوع می‌پردازیم:

داده‌های متنی

$table->char('name', 4);

از این دستور برای ساخت یک نوع‌داده‌ی CHAR با نام و طول مشخص استفاده می‌شود. به عنوان مثال عبارت فوق یک ستون به نام name ایجاد کرده که مقدار ۴ کاراکتر را درون خود ذخیره می‌کند.


$table->string('name', 100);

این دستور برای ساخت نوع‌داده‌ی VARCHAR با نام و طول مشخص مورد استفاده قرار می‌گیرد. به عنوان مثال، عبارت فوق یک ستون به نام name ایجاد کرده که مقدار ۱۰۰ کاراکتر را درون خود ذخیره می‌کند.


$table->boolean('confirmed');

این دستور برای ذخیره‌ی داده‌ای با نوع Boolean یا TINYTEXT استفاده می‌شود. به عنوان مثال، عبارت فوق یک ستون به نام confirmed ایجاد کرده که مقدارهای TRUE و FALSE را درون خود ذخیره می‌کند.


$table->text('description');

این دستور برای ذخیره‌ی نوع داده‌ی TEXT با طول ۲ تا ۶۵۳۵۳ کاراکتر (فضای اشغالی ۶۵ کیلوبایت) بکار گرفته می‌شود. در مثال فوق ستون description جهت انجام اینکار ایجاد شده است.


$table->mediumText('description');

از این دستور برای ذخیره‌ی نوع داده‌ی MEDIUMTEXT با طول ۳ تا ۱۶,۷۷۷,۲۱۵ کاراکتر (فضای اشغالی ۱۶ مگابایت) استفاده می‌شود. در مثال فوق ستون descritption‌ جهت ذخیره‌ی این نوع داده بکار گرفته شده است.


$table->longText('description');

از این دستور برای ذخیره‌ی نوع داده‌ی LONGTEXT با طول ۴ تا ۴,۲۹۴,۹۶۷,۲۹۵ کاراکتر (فضای اشغالی ۴ گیگابایت) استفاده می‌شود. در مثال فوق ستون description جهت ذخیره‌ی این نوع داده بکار گرفته شده است.


$table->binary('data');

این دستور برای ذخیره‌ی باینری اطلاعات بکار می‌رود و شامل نوع داده‌ی BLOB است. در مثال فوق ستونی به نام data تعریف شده و مقادیر در آن ذخیره می‌شوند.


$table->enum('choices', ['foo', 'bar']);

این نوع داده شامل برای ذخیره داده‌های ENUM مورد استفاده قرار می‌گیرد. به عنون مثال در عبارت فوق ستونی به نام choices ایجاد شده است که مقادیر foo و bar در آن ذخیره شده است. مقدار ایندکس foo برابر ۰ و مقدار ایندکس bar برابر ۱ است.

داده‌های عددی

$table->tinyInteger('numbers');

این دستور برای ذخیره‌ی داده‌هایی با نوع TINYINT و محدوده‌ی اعداد ۱۲۸- تا ۱۲۷ یا برای اعداد فقط مثبت بین ۰ تا ۲۵۵+ مورد استفاده قرار می‌گیردمورد استفاده قرار می‌گیرد. به عنوان مثال در عبارت فوق ستونی به نام numbers جهت ذخیره داده‌ها تعریف شده است.


$table->smallInteger('votes');

این دستور برای ذخیره‌ی داده‌هایی با نوع SMALLINT و محدوده‌ی اعداد ۳۲,۷۶۸- تا ۳۲,۷۶۸+ یا برای اعداد فقط مثبت بین ۰ تا ۶۵۳۵۳+ مورد استفاده قرار می‌گیرد. به عنوان مثال در عبارت فوق ستونی به نام votes جهت ذخیره داده‌ها تعریف شده است.


$table->mediumInteger('numbers');

این دستور برای ذخیره‌ی داده‌هایی با نوع MEDIUMINT و محدوده‌ی اعداد ۸,۳۸۸,۶۰۸- تا ۸,۳۸۸,۶۰۸+ یا برای اعداد فقط مثبت بین ۰ تا ۱۶,۷۷۷,۲۱۵+ مورد استفاده قرار می‌گیرد. به عنوان مثال در عبارت فوق ستونی به نام numbers جهت ذخیره داده‌ها تعریف شده است.


$table->integer('votes');

این دستور برای ذخیره‌ی داده‌هایی با نوع INT و محدوده‌ی اعداد ۲,۱۴۷,۴۸۳,۶۴۸- تا ۲,۱۴۷,۴۸۳,۶۴۸+ یا برای اعداد فقط مثبت بین ۰ تا ۴,۲۹۴,۹۶۷,۲۹۵ مورد استفاده قرار می‌گیرد. به عنوان مثال در عبارت فوق ستونی به نام votes جهت ذخیره داده‌ها تعریف شده است.


$table->smallIncrements('id');

این دستور دقیقا مشابه نوع داده‌ی SMALLINT عمل می‌کند با این تفاوت که پس از هربار ساخت ستون، عبارت Primary Key‌ را فعال نگه‌داشته تا مقدار عدد به ازای اضافه شدن هر سطر به جدول به صورت خودکار افزایش (increment) پیدا کند. به عنوان مثال در عبارت فوق یک ستون به نام id به جدول اضافه شده و مقدار آن به صورت خودکار از ۱ تا بی نهایت به ازای اضافه شدن هر سطر، افزایش می‌یابد.


$table->increments('id');

این دستور دقیقا مشابه نوع داده‌ی INT عمل می‌کند با این تفاوت که پس از هربار ساخت ستون، عبارت Primary Key‌ را فعال نگه‌داشته تا مقدار عدد به ازای اضافه شدن هر سطر به جدول به صورت خودکار افزایش (increment) پیدا کند. به عنوان مثال در عبارت فوق یک ستون به نام id به جدول اضافه شده و مقدار آن به صورت خودکار از ۱ تا بی نهایت به ازای اضافه شدن هر سطر، افزایش می‌یابد.


$table->mediumIncrements('id');

این دستور دقیقا مشابه نوع داده‌ی MEDIUMINT عمل می‌کند با این تفاوت که پس از هربار ساخت ستون، عبارت Primary Key‌ را فعال نگه‌داشته تا مقدار عدد به ازای اضافه شدن هر سطر به جدول به صورت خودکار افزایش (increment) پیدا کند. به عنوان مثال در عبارت فوق یک ستون به نام id به جدول اضافه شده و مقدار آن به صورت خودکار از ۱ تا بی نهایت به ازای اضافه شدن هر سطر، افزایش می‌یابد.


$table->bigInteger('votes');

این دستور برای ذخیره‌ی داده‌هایی با نوع BIGINT و محدوده‌ی اعداد ۹,۲۲۳,۳۷۲,۰۳۶,۸۵۴,۷۷۵,۸۰۸- تا ۹,۲۲۳,۳۷۲,۰۳۶,۸۵۴,۷۷۵,۸۰۸+ یا برای اعداد فقط مثبت بین ۰ تا ۱۸۴۴۶۷۴۴۰۷۳۷۰۹۵۵۱۶۱۵+ مورد استفاده قرار می‌گیرد. به عنوان مثال در عبارت فوق ستونی به نام votes جهت ذخیره داده‌ها تعریف شده است.


$table->float('amount', 8, 2);

این دستور برای ذخیره‌ی داده‌هایی با فرمت اعشاری FLOAT است. پارامتر اول به عنوان نام ستون و پارامتر دوم و سوم به ترتیب به عنوان طول داده و اعداد سمت راست ممیز اعشار، معرفی می‌شوند.


$table->decimal('amount', 5, 2);

این دستور برای ذخیره‌ی داده‌هایی با فرمت اعشاری DECIMAL است. پارامتر اول به عنوان نام ستون و پارامتر دوم و سوم به ترتیب به عنوان طول داده و اعداد سمت راست ممیز اعشار، معرفی می‌شوند.


$table->double('amount', 15, 8);

این دستور برای ذخیره‌ی داده‌هایی با فرمت اعشاری DOUBLE است. پارامتر اول به عنوان نام ستون و پارامتر دوم و سوم به ترتیب به عنوان طول داده و اعداد سمت راست ممیز اعشار، معرفی می‌شوند.


$table->ipAddress('visitor');

این دستور برای ذخیره داده‌هایی با فرمت VARCHAR استفاده می‌شود. با استفاده از این عبارت می‌توان ستون‌هایی که نیاز به IP Address دارند را ایجاد کرد. به صورت پیشفرض طول کاراکتر برای VARCHAR برابر ۴۵ خواهد بود. یعنی با اعمال دستور فوق یک ستون به نام visitor از نوع VARCHAR(45) ایجاد می‌شود.


$table->macAddress('device');

این دستور برای ذخیره داده‌هایی با فرمت VARCHAR استفاده می‌شود. با استفاده از این عبارت می‌توان ستون‌هایی که نیاز به mac Address دارند را ایجاد کرد. به صورت پیشفرض طول کاراکتر برای VARCHAR برابر ۱۷ خواهد بود. یعنی با اعمال دستور فوق یک ستون به نام device از نوع VARCHAR(17) ایجاد می‌شود.


$table->json('options'); and  $table->jsonb('options');

این دستور برای ذخیره داده‌هایی با فرمت JSON استفاده می‌شود. تفاوت بین داده‌ی JSON و JSONB در این است که داده‌ی JSON‌ به صورت مستقیم از ورودی دریافت شده و پس از هر بار پردازش در ستون موردنظر ذخیره می‌گردد. درحالیکه داده‌ی JSONB به صورت باینری و دودویی ذخیره می‌گردد و نیازی به پردازش مجدد برای ذخیره‌سازی داده‌ها نیست، بنابراین سریع‌تر عمل می‌کند.


$table->uuid('id');

این دستور برای ذخیره داده‌هایی با فرمت CHAR استفاده می‌شود. با استفاده از این عبارت می‌توان به جای ID کاربران از یک uuid یا یک رشته معمولا به طول ۳۶ کاراکتر استفاده کرد تا نمایانگر ID هر فرد باشد. این رشته معمولا به صورت خودکار ایجاد می‌شود و احتمال اینکه دو مقدار uuid با یکدیگر یکسان باشند تقریبا صفر است.

داده‌های مربوط به تاریخ

$table->date('created_at');

این دستور داده‌ای از نوع DATE را درون دیتابیس جهت ذخیره‌سازی اطلاعات ایجاد می‌کند. به عنوان مثال عبارت فوق یک ستون تحت عنوان created_at جهت ذخیره‌سازی اطلاعات در جدول ایجاد می‌کند.


$table->dateTimeTz('created_at');

این دستور داده‌ای از نوع DATETIME به همراه تاریخ محلی (بدون تبدیل به گرینویچ) را درون دیتابیس جهت ذخیره‌سازی اطلاعات ایجاد می‌کند. به عنوان مثال عبارت فوق یک ستون تحت عنوان created_at جهت ذخیره‌سازی اطلاعات در جدول ایجاد می‌کند.


$table->dateTime('created_at');

این دستور داده‌ای از نوع DATETIME را درون دیتابیس جهت ذخیره‌سازی اطلاعات ایجاد می‌کند. به عنوان مثال عبارت فوق یک ستون تحت عنوان created_at جهت ذخیره‌سازی اطلاعات در جدول ایجاد می‌کند.


$table->timestamp('added_on');

این دستور داده‌ای از نوع TIMESTAMP را درون دیتابیس جهت ذخیره‌سازی اطلاعات ایجاد می‌کند. به عنوان مثال عبارت فوق یک ستون تحت عنوان add_on جهت ذخیره‌سازی اطلاعات در جدول ایجاد می‌کند.


$table->timestampTz('added_on');

این دستور داده‌ای از نوع TIMESTAMP با تاریخ محلی (بدون تبدیل به گرینویچ) را درون دیتابیس جهت ذخیره‌سازی اطلاعات ایجاد می‌کند. به عنوان مثال عبارت فوق یک ستون تحت عنوان add_on جهت ذخیره‌سازی اطلاعات در جدول ایجاد می‌کند.


$table->timestamps();

این دستور  دو داده‌ از نوع TIMESTAMP با عنوان ستون created_at و updated_at درون دیتابیس جهت ذخیره‌سازی زمان ثبت یک رکورد و یا ویرایش آن، ایجاد می‌کند.


$table->timestampsTz();

این دستور  دو داده‌ از نوع TIMESTAMP با عنوان ستون created_at و updated_at درون دیتابیس جهت ذخیره‌سازی زمان با حالت زمان محلی (بدون تبدیل به گرینویچ) ثبت یک رکورد و یا ویرایش آن، ایجاد می‌کند.


سایر انواع داده‌ها

$table->morphs('taggable');

این دستور دو ستون با نام‌های colName_id (با فرمت INT) و colName_type (با فرمت TEXT) ایجاد کرده و برای روابط Polymorphic (چند ریختی) لاراول مورد استفاده قرار می‌گیرد. (در جلسات بعد درباره این نوع رابطه به طور مفصل صحبت خواهیم کرد)


$table->rememberToken();

این دستور یک ستون تحت عنوان remember_token از نوع VARCHAR با طول کاراکتر ۱۰۰ ایجاد می‌کند که قابلیت NULL دارد.


$table->softDeletes();

این دستور یک ستون تحت عنوان deleted_at از نوع DATETIME ایجاد می‌کند تا به ازای حذف هر رکورد در حالت ورود به recycle bin‌ دیتابیس تاریخ آن ثبت شود.

بسیار عالی به شما عزیزان تبریک می‌گوییم تا به اینجای کار با نحوه‌ی ایجاد ستون‌ها در انواع متخلف در پایگاه داده‌ی MySQL با استفاده از لاراول آشنا شدید. برای جلوگیری از طولانی شدن این مبحث، سایر دستورهایی که به صورت زنجیره‌وار به دستورهای فوق متصل می‌شوند را در بخش بعدی توضیح خواهیم داد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری لاراول توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (1 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

ثمین
17 خرداد 1399
با سلام ، استاد من وقتی php artisan migration رو تو گیت می زنم جدول های user,migration ایجاد میشن ولی جدول password اکی نمیشه و failed میشه باید چه کاری انجام بدم ؟ پیام نشون داده شده تو گیت به این شکل: $ php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.71 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.24 seconds)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.