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

27 اسفند 1395
درسنامه درس 11 از سری لاراول
Laravel-Main-database

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

دستورهای تصحیح‌کننده‌ی ستون‌ها (Column Modifiers)

nullable()

این دستور اجازه می‌دهد که یک ستون مقدار Null داشته باشد. (مقدار null به حالتی گفته می‌شود که کاربر فیلدی را خالی می‌گذارد و دیتابیس آن مقدار «هیچ» را ذخیره می‌کند. به مثال زیر توجه کنید:

Schema::table('posts', function( Blueprint $table){
    $table->string('description')->nullable();
});

توجه داشته باشید که تمامی دستورها به صورت زنجیره وار به یکدیگر ( به یک شیء) متصل هستند.


default($value)

این دستور برای قرار دادن مقادیر پیش‌فرض برای یک ستون استفاده می‌شود. مثلا اگر کاربری یک فیلد را پر نکند مقدار پیش فرض آن برابر value$‌ خواهد بود:

Schema::table('posts', function( Blueprint $table){
    $table->string('title')->default('Roxo Programming Group');
});

 unsigned()

از این دستور برای بدون علامت کردن (مثبت کردن) داده‌های عددی استفاده می‌شود. معمولا برای id‌ها و ... از این دستور استفاده می‌کنیم:

Schema::table('posts', function( Blueprint $table){
    $table->integer('id')->unsgined();
});

first()

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

Schema::table('posts', function( Blueprint $table){
    $table->integer('id')->first();
});

after('colName')

این عبارت برای قرار دادن ستون بعد از یک ستون مشخص استفاده می‌شود. مثلا می‌خواهیم ستون description بعد از ستون id قرار بگیرد در این صورت داریم:

Schema::table('posts', function( Blueprint $table){
    $table->string('description')->after('id');
});

comment('my comment')

از این دستور برای نوشتن مستندات یا داکیومنت برای یک ستون خاص استفاده می‌شود. به مثال زیر توجه کنید:

Schema::table('posts', function( Blueprint $table){
    $table->integer('id')->comment('ID for each access entry');
});

storedAs($expression)

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

Schema::table('posts', function( Blueprint $table){
    $table->integer('numberOne');
    $table->integer('numberTwo');
    $table->integer('sum')->sotredAs('numberOne + numberTwo');
});

همانطور که ملاحظه می‌کنید دستور موجود در خط ۴ این مثال ستون‌های numberOne و numberTwo را هنگامیکه یک سطر به جدول اضافه یا آپدیت می‌شود، با یکدیگر جمع کرده و در ستون sum می‌ریزد.


virtualAs($expression)

دقیقا مشابه دستور storedAs است با این تفاوت که مقادیر پس از محاسبه داخل یک ستون ذخیره نمی‌شوند بلکه هنگام فراخوانی (خواندن) یکی از سطرهای جدول برای کاربر محاسبه شده و نمایش داده می‌شود. این دستور باعث می‌شود که یک ستون هیچ فضایی را اشغال نکند.  به مثال زیر توجه کنید:

Schema::table('posts', function( Blueprint $table){
    $table->integer('numberOne');
    $table->integer('numberTwo');
    $table->integer('sum')->virtualAs('numberOne + numberTwo');
});

همانطور که ملاحظه می‌کنید دستور موجود در خط ۴ این مثال ستون‌های numberOne و numberTwo را هنگامیکه یک سطر از جدول فراخوانی می‌شود محاسبه کرده و به صورت مجازی در ستون sum نگه می‌دارد. توجه کنید که آن را ذخیره نمی‌کند.

اصلاح و ویرایش ستون‌ها

جهت اصلاح و ویرایش ستون‌ها همواره دستورهایی وجود دارند که با اعمال آنها می‌توانید فرآیند اصلاح ستون‌ها را به راحتی هرچه تمام تر انجام دهید.

برای استفاده از دستور change همواره باید پکیج doctrine/dbal را نصب کنید. این کتابخانه به شما کمک می‌کند تا ستون‌های جداول موجود در پایگاه داده را تنها با اعمال یک یا چند دستور ساده ویرایش کنید. به عبارت دیگر با ارسال یک کوئری این امکان را برای شما فراهم می‌کند. برای نصب این پکیج دستور زیر را در CMD تایپ کنید:

composer require doctrine/dbal

بسیار عالی. حال پکیج موردنظر نصب شده و دستورهای زیر فعال می‌گردد:

بروزسانی ویژگی‌های یک ستون

متد change برای بروزرسانی و آپدیت نوع یا ویژگی‌های ستون‌های موجود مورد استفاده قرار می‌گیرد. به عنوان مثال اگر بخواهید سایز یک ستون string را افزایش و یا کاهش دهید از دستور زیر استفاده می‌کنید:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});

با استفاده از این دستور ستون name که مثلا تعداد کاراکترهای دریافتی آن ۱۰۰ بوده را به ۵۰ کاهش می‌دهد.

اگر بخواهیم یکی از ویژگی‌های تصحیح‌کننده بالا را به یک ستون اعمال کنیم کافی‌ست دستور change‌ را در انتهای آنها استفاده کنیم. به مثال زیر توجه کنید:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
});

در این مثال علاوه بر اینکه مقدار ستون name از ۱۰۰ به ۵۰ کاهش پیدا می‌کند بلکه این ستون nullable می‌شود.

توجه: ستون‌هایی که نوع داده آنها برابر:‌ char, double, enum, mediumInteger, timestamp, tinyInteger, ipAddress, json, jsonb, macAddress, mediumIncrements, morphs, nullableMorphs, nullableTimestamps, softDeletes, timeTz, timestampTz, timestamps, timestampsTz, unsignedMediumInteger, unsignedTinyInteger, uuid است تغییر‌پذیر نیستند. یعنی متد change برای آنها اعمال نخواهد شد.

تغییر نام ستون‌ها

گاها برای شما پیش آمده است که می‌خواهید نام یک ستون را تغییر دهید. برای اینکار کافی‌ست مشابه دستور change ابتدا پکیچ doctrine/dbal را با استفاده از دستور زیر نصب کنید:

composer require doctrine/dbal

سپس متد renameColumn را به جدول موردنظر اعمال کنیم. به مثال زیر توجه کنید:

Schema::table('posts', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

// Example
Schema::table('posts', function (Blueprint $table) {
    $table->renameColumn('posts', 'articles');
});

همانطور که ملاحظه کردید با استفاده از دستورهای فوق ستون‌ posts به ستون articles تغییر نام پیدا کرده است.

توجه: تمام ستون‌هایی که از نوع enum هستند را نمی‌توان تغییر نام داد

حذف ستون‌ها

برای حذف ستون‌ها نیز دستوری تحت عنوان dropColumn وجود دارد که از پکیج doctrine/dbal در دسترس است. ابتدا پکیج را نصب کرده و سپس دستور composer update را اجرا کنید. به مثال زیر توجه کنید:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('votes');
});

با دستور dropColumn در جدول users ستون votes حذف خواهد شد.

در صورتیکه بخواهید چندین ستون را حذف کنید کافیست تک تک آنها را درون یک آرایه‌ی کلی به متد dropColumn‌ ارسال کنید:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
});

ایندکس‌ها (Indexes)

ممکن است این سوال برای شما پیش بیاید که مفهوم ایندکس چیست؟ ایندکس در پایگاه داده حکم منظم کردن و افزایش سرعت دسترسی به اطلاعات را دارد. اگر جدول شما ایندکسی نداشته باشد عملا سیستم شما در رکوردهای میلیونی از کار می‌افتد. ایندکس یک نوع مرتب‌کردن رکوردهای یک جدول بر اساس ستونی که ایندکس می‌شود تعریف می‌شود. هر جدول باید و باید حداقل یک ایندکس داشته باشد که در ۹۹ درصد مواقع id یک جدول که increment یا primary key‌ هست به صورت خودکار index خواهد شد. درصورتیکه تعداد ایندکس در یک جدول زیاد باشد عملیات insert و update با مشکل مواجه خواهد شد. در حالت کلی چندین قانون برای تعریف یک ایندکس وجود دارد که در ذیل به آنها اشاره می‌کنیم:

  1. هنگامی‌که با جداول و داده‌های نسبتا کوچک کار می‌کنید از ایندکس استفاده نکنید.
  2. در حالت کلی ایندکس‌ها مانند مرتب کردن یک کتابخانه بر اساس حروف الفبا هستند، و معمولا روی ستون‌هایی تعریف می‌شوند که در Join یا جداول با روابط استفاده می‌شوند.
  3. ایندکس‌ها زمانی باید استفاده شوند که بخش کوچکی از حجم بزرگ اطلاعات را می‌خواهیم در دسترس داشته باشیم. زیرا اگر بخواهیم کل اطلاعات را در یک جستجو بدست بیاوریم استفاده از ایندکس‌ها باعث کند شدن پردازش اطلاعات خواهند شد.
  4. از ایندکس‌ها زمانی استفاده نمایید که مقادیر یک ستون تنوع داده‌ای زیادی داشته باشند یعنی تعداد داده‌های تکراری یک ستون کم باشد.

متد unique

از این متد برای یکتاسازی یک ستون استفاده می‌شود که نوعی ایندکس به شمار می‌آید. به مثال زیر توجه کنید:

$table->string('email')->unique();

همانطور که در مثال فوق ملاحظه می‌کنید ستون email به صورت unique تعریف شده است. یعنی تنها و تنها این ستون یک مقدار واحد را می‌پذیرد و مقادیر تکراری پذیرفته نیست.

همچنین درنظر دارید که پس از ایجاد یک ستون نیز می‌توان متد unique را اعمال کرده و ستون را اصلاح کنیم. به دستور زیر توجه کنید:

$table->unique('email');

با این دستور روی ستون email که قبلا ساخته شده بود ایندکس unique اعمال می‌شود.

اگر بخواهید  چند ستون را به‌طور همزمان index کنید باید از دستور زیر استفاده کنید:

$table->index(['account_id', 'created_at']);

در ادامه به توضیح برخی از ایندکس‌ها می‌پردازیم:

$table->primary('id');

از این دستور برای اضافه کردن ایندکس primary key یا کلید اصلی به یک ستون استفاده می‌شود. تفاوت بین index و primary key ها در این است که ایندکس‌ها لزوما Unique نیستند درحالیکه کلیدهای اصلی همواره Unique هستند!


$table->primary(['first', 'last']);

از این دستور برای اضافه کردن ایندکس کلیدهای ترکیبی primary استفاده می‌شود. مثلا درنظر بگیرید در جدول یک دانشجو که شامل نام دانشجو، شماره کارت ملی دانشجو و شماره کارت دانشجویی است، ستون‌های شماره کارت ملی دانشجو و شماره کارت دانشجویی می‌تواند به عنوان یک کلید اصلی شناخته شوند.


$table->unique(['first','last']);

از این دستور برای استفاده از ایندکس یکتاسازی برای چند ستون استفاده می‌شود.


$table->index('state');

از این دستور برای ایجاد یک ایندکس اصلی استفاده می‌شود. این دستور به منظور مرتب‌سازی یک جدول بکار گرفته می‌شود.

حذف ایندکس‌ها

برای حذف یک ایندکس در ستون‌های یک جدول باید از دستورهای زیر استفاده کرد:

$table->dropPrimary('users_id_primary');

$table->dropUnique('users_email_unique');

$table->dropIndex('geo_state_index');

اجرای Migration

پس از فراگیری تمام متدها و روش‌های ایجاد انواع داده، ستون و جداول در لاراول، به نحوه‌ی آشنایی با دستورات Migration جهت انتقال این اطلاعات و مپ (ارسال) آنها به پایگاه‌داده MySQL می‌پردازیم.

دستور Migrate

ارسال تمام اطلاعاتی که در تمام فایل‌های موجود در پوشه‌ی database/migrations ایجاد شده‌اند توسط دستور زیر صورت می‌گیرد:

php artisan migrate

گاهی برای انتقال اطلاعات از طریق migrate خطایی برای کاربر نمایش می‌دهد که ناشی از نبود اطلاعات یا به اصطلاح lose data است. برای نادیده گرفتن این خطاها باید عبارت force-- را پس از دستور فوق قرار داده تا سیستم به اطلاعات از دست رفته توجهی نکند:

php artisan migrate --force

دستور Rollback

بسیار برای شما پیش آمده است که جدولی را به اشتباه map کردید و یا می‌خواهید تغییرات را به عقب باز گردانید. در حالت خیلی ساده‌تر می‌توان گفت می‌خواهید دستور ctrl+z رو روی تمام آنچه در پایگاه داده است اعمال کنید. برای اینکار از دستور rollback به صورت زیر استفاده می‌کنید:

php artisan migrate:rollback

این دستور تنها یک قدم به عقب بازگشته و اطلاعات را تا یک مرحله برای شما بازیابی می‌کند حال اگر بخواهید این اطلاعات تا چندین مرحله به عقب بازگردد باید از دستور 5=step-- استفاده کرد:

php artisan migrate:rollback --step=5

دستور Reset

همچنین دستور دیگری برای reset کردن اطلاعات موجود در دیتابیس وجود دارد که تمام جداول و اطلاعات را حذف می‌کند و سیستم را به اولین روز باز می‌گرداند. این دستور به صورت زیر اعمال می‌شود:

php artisan migrate:reset

دستور Refresh

از طرفی دستوری وجود دارد که علاوه بر reset کردن اطلاعات مجددا دستور migrate را انجام می‌دهد. نام این دستور refresh می‌باشد که به صورت ذیل تعریف می‌شود:

php artisan migrate:refresh

همچنین می‌توان تعداد مراحلی که می‌خواهیم جداول حذف شده و از اول ساخته شوند را تعیین نمود:

php artisan migrate:refresh --step=5

با اعمال این دستور تا ۵ مرحله به عقب اطلاعات حذف شده و مجددا دستور migrate‌ صورت می‌گیرد.

 

بسیار عالی. به شما دوستان عزیز تبریک می‌گوییم. با مطالعه‌ی این فصل اطلاعات شما در ارتباط با پایگاه داده و نحوه‌ی ایجاد آن در لاراول کامل شد. حال شما ۰ تا ۱۰۰ طراحی پایگاه داده را می‌توانید بدون وجود هیچگونه مشکلی انجام دهید. در فصل بعدی به توضیح دقیق Collections, Eloquent‌ و Modelها به همراه ارائه‌ی چندین مثال کاربردی می‌پردازیم.

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

دیدگاه‌های شما (1 دیدگاه)

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

میثم
30 مرداد 1397
چقدر خوبی تو !!! ادامه بده ...

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