رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش Migration در لاراول 5
#1
migration یک نوع کنترل ورژن برای دیتابیس برنامه تان است. به تیم برنامه نویسی شما این اجازه رو مییدهد که شما (Schema) دیتابیس رو طراحی کنند و تغییر بدهند. با این ابزار شما می توانید نسخه های مختلفی از دیتابیس رو هم داشته باشین که با یکسری دستورات میتونید به نسخه های مختلف سوئیچ کنید. یکی از مزیت های دیگر آن مهم نبودن نوع دیتابیس است و دستورات شما با همه دیتابیس هایی که لاراول ساپورت میکند کار خواهد کرد. migration به طور معمول با استفاده از Schema Builder کار میکند.


ایجاد یک migration

در فریم ورک لاراول با استفاده از دستور make:migration و تایپ آن در ترمینال می توانیم یک migration جدید ایجاد کنیم:

کد پی‌اچ‌پی:
php artisan make:migration create_users_table 


migration ایجاد شده در مسیر پوشه database/migrations قرار می گیرد. اکنون با استفاده از دستورات Schema Builder می توانیم schema جدول موردنظرمان را طراحی کنیم.


کد پی‌اچ‌پی:
use Illuminate\Database\Schema\Blueprint;
use 
Illuminate\Database\Migrations\Migration;
 
class 
CreateUsersTable extends Migration {
 
 
   /**
     * Run the migrations.
     *
     * @return void
     */
 
   public function up()
 
   {
 
       Schema::create('users', function(Blueprint $table)
 
       {
 
           $table->increments('id');
 
           $table->string('name');
 
           $table->string('email')->unique();
 
           $table->string('password'60);
 
           $table->timestamps();
 
       });
 
   }
 
 
   /**
     * Reverse the migrations.
     *
     * @return void
     */
 
   public function down()
 
   {
 
       Schema::drop('users');
 
   }
 



همانطور که می بینید کلاس migration دارای دو متد به نام up و down می باشد. از up برای ایجاد جدول و افزودن یا تغییر ستون هاو از down برای عمل برعکس آن استفاده میکنیم مثلا اگر جدولی را ایجاد کرده ایم در متد down آن را حذف میکنیم. از کلاس Schema و متد create برای ایجاد جدول استفاده میکنیم که دو پارامتر می گیرد اولی نام جدول می باشد و دومی یک تابع بی نام می باشد که آبجکت table$ را به عنوان پارامتر میگیرد.داخل تابع ستون ها را تعریف میکنیم. به صورتی که متدهای آبجکت table$ نوع ستون و پارامتر ورودی آنها نام ستون را مشخص میکند.

مثلا متد increments نوع int و کلید اصلی به همراه AutoIncrement در نظر میگیرد.

string نوع varchar در نظر گرفته می شود و پارامتر دومی هم میشود به آن داد که طول رشته را مشخص میکند.

unique ستون را به ایندکس unique تبدیل میکند.

timestamps فیلدهای زمانی created_at و updated_at را ایجاد میکند.

برای اطلاعات بیشتر در مورد نحوه ایجاد ستون ها به اینجا مراجعه کنید.



در تابع down هم با استفاده از متد drop مشخص کردیم جدول users حذف شود.
با استفاده از دستور زیر می توانید migration ایجاد شده را اجرا کنید:


کد پی‌اچ‌پی:
php artisan migrate 


با اجرای دستور بالا جدول موردنظر در دیتابیس ایجاد خواهد شد. البته دستور بالا تمام migration هایی که اجرا نشده اند را اجرا میکند.


و با استفاده از دستور زیر می توانید دستورات متد down را اجرا کنید و باتوجه به مثال بالا جدول users حذف می شود :


کد پی‌اچ‌پی:
php artisan migrate:rollback 


نکته : اگر در هنگام اجرای دستور migrate پیغام خطای "class not found" داد از دستور زیر قبل از دستور migrate در ترمینال استفاده کنید :


کد پی‌اچ‌پی:
composer dump-autoload 


در هنگام ایجاد migration می توانید نام جدول را هم در دستور مشخص کنید .


کد پی‌اچ‌پی:
php artisan make:migration create_users_table --create=users 


برای نامگزاری فایل migration معمولا از یک نام با مسما که نشانده عملیات موردنظرمان است استفاده میکنیم مثلا برای افزودن یک ستون جدید به نام votes در جدول users به این صورت فایل را نامگزاری و ایجاد میکنیم :


کد پی‌اچ‌پی:
php artisan make:migration add_votes_to_users_table --table=users 


بعضی از عملیات های دیتابیس ممکن است مخرب باشند و هنگامی در جداول دیتابیس داده ای وجود داشته باشد باعث از بین رفتن برخی داده ها شود برای محافظت از این خطرات از دستور migaret به صورت زیر استفاده کنید و در پایان آن force-- را قرار دهید :


کد پی‌اچ‌پی:
php artisan migrate --force 


همانطور که در پست قبل دیدید از دستور rollback استفاده کردیم که این دستور روی آخرین عملیات migration عمل میکند. برای اینکه همه عملیات ها را rollback کنیم از دستور migrate:reset استفاده میکنیم و در صورتی که بخواهیم همه عملیات ها rollback و سپس دوباره اجرا شوند از migrate:refresh استفاده میکنیم.


کد پی‌اچ‌پی:
php artisan migrate:resetphp artisan migrate:refresh 


فرض کنید میخواهیم ستون ایمیل را به جدول users اضافه کنیم ابتدا فایل migration ای ایجاد و سپس در متد up آن دستور زیر را می نویسیم :


کد پی‌اچ‌پی:
Schema::table('users', function($table)
{
 
   $table->string('email');
 
}); 


در متد down هم دستورات زیر را قرار میدهیم :


کد پی‌اچ‌پی:
Schema::table('users', function($table)
{
 
   $table->dropColumn('email');
 
}); 


حالا با اجرای دستور php artisan migrate ستون موردنظر ایجاد خواهد شد. همچنین می توانیم با استفاده از after آن را بعد از ستون خاصی در دیتابیس قرار دهیم وگرنه به انتهای جدول افزوده می شود.

همانطور که در پست قبل هم گفتم متدهای بسار زیادی برای تعریف ستون ها وجود دارد که می توانید از اینجا با هرکدام آشنا شوید.


برای تغییر نام جدول از متد rename از کلاس Schema مانند مثال اول در زیر استفاده کنید. با استفاده drop هم می توانیم جدولی را حذف کنیم و dropIfExists هم ابتدا بررسی میکند اگر جدول وجود داشت آن را حذف میکند.

کد پی‌اچ‌پی:
Schema::rename($from$to);
Schema::drop('users');
 
Schema::dropIfExists('users'); 


برای ویرایش یک ستون ابتدا بایستی مطمئن شوید که وابستگی doctrine/dbal روی فریمورک نصب شده باشد در غیر اینصورت مانند زیر عمل کنید:

در بخش require فایل composer.json آن را اضافه کرده :


کد پی‌اچ‌پی:
"require": {
 
   "laravel/framework""5.0.*",
 
   "illuminate/html""~5.0",
 
   "doctrine/dbal""2.5.*",
}, 


سپس از دستور composer update در ترمینال برای نصب این وابستگی استفاده کنید.


همانند مثال زیر می توانیم یک ستون را ویرایش کنیم. در مثال زیر طول ستون name را به ۵۰ کاراکتر تغییر داده و آن را قابل NULL بودن تعریف میکنیم:

کد پی‌اچ‌پی:
Schema::table('users', function($table)
{
 
   $table->string('name'50)->nullable()->change();
}); 


برای افزودن کلید خارجی به یک جدول هم به این صورت عمل میکنیم :


کد پی‌اچ‌پی:
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users'); 


ابتدا یک ستون unsigned عددی به نام user_id ایجاد کردیم و سپس در پایین آن را کلید خارجی تعریف کردیم و گفتیم که مرجعی از ستون id از جدول users می باشد.

همچنین می توانیم خاصیت onDelete آن راهم تعیین کنیم :


کد پی‌اچ‌پی:
$table->foreign('user_id')
 
     ->references('id')->on('users')
 
     ->onDelete('cascade'); 


برای حذف کلید خارجی هم همانند مثال زیر عمل میکنیم :


کد پی‌اچ‌پی:
$table->dropForeign('posts_user_id_foreign'); 


با استفاده از متد hasTable می توانیم بررسی کنیم آیا جدول موردنظر وجود دارد یا خیر و یا با استفاده از متد hasColumn بررسی کنیم در جدول موردنظر ستون های موردنظرمان وجود دارد یا خیر:


کد پی‌اچ‌پی:
if (Schema::hasTable('users'))
{
 
   //
}
 
if (
Schema::hasColumn('users''email'))
{
 
   //



برای افزودن و حذف ایندکس می توانیم همانند مثال های زیر عمل کنیم :


کد پی‌اچ‌پی:
$table->string('email')->unique();
$table->dropUnique('email'); 


برای حذف ستونهای زمانی هم مانند مثال های زیر عمل کنید:


کد پی‌اچ‌پی:
$table->dropTimestamps();
$table->dropSoftDeletes(); 


همچنین می توانیم موتور ذخیره سازی دیتابیس را هم مشخص کنیم :


کد پی‌اچ‌پی:
$table->engine 'InnoDB'

(با تشکر از حامد آریان)
قوانین انجمن لاراولیستا  | شماره تماس :‌09124783045 |‌ تلگرام :‌ 09377869283
پاسخ
#2
آموزش ها عالین ... ممنونم
یه پیشنهادی داشتم اینکه بعد از اتمام آموزش ها بیایید یه پروژه آزمایشی مثل یه cms ساده رو پیاده سازی کنید ... برای بهتر مفهوم شدن آموزش ها. ممنون میشم پاسخ بدید.
منهاج , راه روشن طراحی
پاسخ
#3
پیشنهاد خوبی دادی منهاج جان
ولی این جور پروژه های آزمایشی به صورت فیلم باشن خیلی بهتره..با استفاده از متن نمیشه حق مطلب رو ادا کرد
قوانین انجمن لاراولیستا  | شماره تماس :‌09124783045 |‌ تلگرام :‌ 09377869283
پاسخ
#4
خب اگر نظر منو بخواید به به خاطر سرعت پایین نت نمیشه خوب هم آپلود کرد و هم دانلود کرد.
سخت میشه یکم.
خود من آموزش های متنی و کتابی رو به آموزش های فیلمی ترجیح میدم .
منهاج , راه روشن طراحی
پاسخ
#5
برای انتقال داده ها مون ب یک db دیگه چکار باید بکنمیم ؟
پاسخ
#6
(12-09-2015, 03:23 PM)dadeyar نوشته:  برای انتقال داده ها مون ب یک db دیگه چکار باید بکنمیم ؟

میتونید از جدول خروجی Export بگیرید و داخل یک جدول دیگه Import کنید .
کد آن است که خود ببوید نه آن که برنامه نویس بگوید  Cool
پاسخ
#7
سلام و خسته نباشید
وقتی من از migrate استفاده میکنم برای اجرای دیتابیس این خطا رو میده.

ممنون میشم کمک کنید.

[PDOException]
SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using p
assword: YES)
پاسخ
#8
(08-06-2016, 06:35 AM)ilbeygi نوشته:  سلام و خسته نباشید
وقتی من از migrate استفاده میکنم برای اجرای دیتابیس این خطا رو میده.

ممنون میشم کمک کنید.

 [PDOException]
 SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using p
 assword: YES)

احتمالا توی فایل env. به دیتابیس پسورد دادین ولی در Phpmyadmin پسورد نداره دقت کنید اطلاعات رو به درستی وارد کردین
پاسخ
#9
(08-07-2016, 07:07 AM)hamo نوشته:  احتمالا توی فایل env. به دیتابیس پسورد دادین ولی در Phpmyadmin پسورد نداره دقت کنید اطلاعات رو به درستی وارد کردین

نه اون از اول درست بود.
پاسخ
#10
(08-06-2016, 06:35 AM)ilbeygi نوشته:  سلام و خسته نباشید
وقتی من از migrate استفاده میکنم برای اجرای دیتابیس این خطا رو میده.

ممنون میشم کمک کنید.

 [PDOException]
 SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using p
 assword: YES)


سلام
اگه از زمپ استفاده میکنین در فایل .env این مقادیر رو
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

با

DB_DATABASE=نام پایگاه داده ای که ساختین
DB_USERNAME=root
DB_PASSWORD هم باید بدون مقدار باشد

جایگزین کنید
پاسخ
 


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش اعتبار سنجی در لاراول 5 alihossein 4 771 11-20-2016, 07:12 AM
آخرین ارسال: حمید رﺽا کمالی
  آموزش روتینگ routing در لاراول 5 alihossein 2 1,124 11-12-2016, 04:37 AM
آخرین ارسال: حمید رﺽا کمالی
  آموزش کار با دیتابیس در لاراول 5 alihossein 6 1,552 10-27-2016, 01:01 PM
آخرین ارسال: sempaisaleh
  ارتباط model با migration ebibombas1988 1 55 08-06-2016, 06:33 AM
آخرین ارسال: hamo
  آموزش فارسی لاراول ۵ alihossein 4 2,856 07-22-2016, 04:16 PM
آخرین ارسال: elham_malekmohamadi
  # سوال : آموزش ساخت ربات تلگرام با پکیج irazasyed/telegram-bot-sdk Bvk.Programmer 0 234 04-25-2016, 04:54 PM
آخرین ارسال: Bvk.Programmer
  درخواست آموزش کار با پکیج intervention/image Bvk.Programmer 6 492 04-18-2016, 05:52 PM
آخرین ارسال: hamo
  نوع فایل در migration maryam 1 95 04-04-2016, 12:21 PM
آخرین ارسال: Bvk.Programmer
Rainbow آموزش : پکیچ کاربردی ajax-blade Bvk.Programmer 0 200 02-15-2016, 06:04 PM
آخرین ارسال: Bvk.Programmer
  آموزش Session ها در لاراول 5 alihossein 1 662 01-29-2016, 12:33 PM
آخرین ارسال: SajadDP

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

درباره انجمن فریم ورک لاراول

انجمن لاراولیستا به عشق توسعه دهنده ها و علاقمندان به این فریم ورک محبوب ایجاد شده و امیدواریم با نظرات خوبتون ما رو در بهبود کار یاری کنید. در ضمن خیلی هم خوشحال میشیم شما هم در توسعه این انجمن سهمی داشته باشید.