در لاراول، مایگریشنها (Migrations) ابزاری هستند که به شما امکان میدهند ساختار پایگاه داده خود را به صورت کدنویسی مدیریت کنید. با استفاده از مایگریشنها میتوانید جداول، ستونها، ایندکسها و کلیدهای خارجی را به راحتی ایجاد یا تغییر دهید، بدون اینکه نیازی به تغییر دستی پایگاه داده داشته باشید.
ایجاد یک Migration جدید
برای ایجاد یک مایگریشن جدید در لاراول، از دستور زیر استفاده میکنیم:
php artisan make:migration create_table_name
این دستور یک فایل مایگریشن در پوشه database/migrations
ایجاد میکند.
ساختار یک Migration
هر فایل مایگریشن شامل دو متد اصلی است:
up()
: در این متد تغییرات جدید به پایگاه داده اعمال میشوند (مثلاً ایجاد جدول، اضافه کردن ستون، و غیره).down()
: این متد برای بازگشت تغییرات اعمالشده به کار میرود (برای حذف جدول یا لغو تغییرات انجامشده درup()
).
به عنوان مثال، فرض کنید میخواهید یک جدول posts
بسازید:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id(); // ایجاد ستون id به عنوان کلید اصلی
$table->string('title'); // ایجاد ستون title
$table->text('body'); // ایجاد ستون body
$table->timestamps(); // ایجاد ستونهای created_at و updated_at
});
}
public function down()
{
Schema::dropIfExists('posts');
}
}
اجرای Migration
برای اعمال تغییرات مایگریشنی که ایجاد کردهاید، دستور زیر را وارد میکنید:
php artisan migrate
این دستور تمام مایگریشنهایی که هنوز اعمال نشدهاند را اجرا میکند.
بازگشت از Migration
اگر بخواهید تغییرات را لغو کنید، میتوانید از دستور migrate:rollback
استفاده کنید:
php artisan migrate:rollback
این دستور تغییرات آخرین اجرای مایگریشنها را برمیگرداند.
شما می توانید تعداد محدودی از مایگریشن ها را با ارائه گزینه step به دستور rollback برگردانید. به عنوان مثال، دستور زیر پنج مرحله مایگریشن آخر را به عقب برمی گرداند:
php artisan migrate:rollback --step=5
برای مشاهده وضعیت مایگریشنها میتوانید از دستور زیر استفاده کنید:
php artisan migrate:status
همه جداول را حذف کنید و دوباره بسازید
دستور migrate:fresh همه جداول را از پایگاه داده حذف می کند و سپس دستور migrate را اجرا می کند:
php artisan migrate:fresh
php artisan migrate:fresh --seed
کلاسschema
کلاس Schema
در لاراول ابزار قدرتمندی برای مدیریت ساختار پایگاه داده است. با استفاده از این کلاس میتوانید جداول جدید بسازید، جداول موجود را تغییر دهید، ستونها را اضافه یا حذف کنید، ایندکسها و کلیدهای خارجی را تنظیم کنید و به طور کلی ساختار پایگاه داده را به سادگی مدیریت کنید.
متدهای مربوط به ایجاد جداول و ستونها
create: ایجاد یک جدول جدید.
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->timestamps();
});
drop: حذف یک جدول.
Schema::drop('posts');
dropIfExists: حذف جدول فقط در صورتی که وجود داشته باشد.
Schema::dropIfExists('posts');
table: برای اعمال تغییرات روی جدول موجود (افزودن ستونها یا تغییرات دیگر).
Schema::table(‘posts’, function (Blueprint $table) {
$table->string(‘author’)->nullable();
});
rename: تغییر نام جدول.
Schema::rename('posts', 'articles');
- متدهای مربوط به ستونها
id: ایجاد ستون id به عنوان کلید اصلی (Auto Increment).
$table->id(); // مشابه با $table->bigIncrements('id');
bigIncrements: ایجاد یک ستون BIGINT به عنوان کلید اصلی (Auto Increment).
$table->bigIncrements('id');
string: ایجاد ستون از نوع رشته (VARCHAR).
$table->string('title');
text: ایجاد ستون از نوع متن.
$table->text('body');
integer: ایجاد ستون از نوع عدد صحیح (Integer).
$table->integer('views');
float: ایجاد ستون از نوع عدد اعشاری.
$table->float('price');
boolean: ایجاد ستون از نوع بولین (True/False).
$table->boolean('is_active');
date: ایجاد ستون از نوع تاریخ.
$table->date('published_at');
datetime: ایجاد ستون از نوع تاریخ و زمان.
$table->datetime('created_at');
timestamp: ایجاد ستون از نوع timestamp.
$table->timestamp('deleted_at')->nullable();
decimal: ایجاد ستون از نوع عدد اعشاری با دقت خاص.
$table->decimal('amount', 8, 2); // 8 عدد کل و 2 عدد اعشاری
enum: ایجاد ستون از نوع Enum (برای انتخاب یک مقدار از یک مجموعه خاص).
$table->enum('status', ['draft', 'published', 'archived']);
uuid: ایجاد ستون برای UUID.
$table->uuid('uuid');
foreignId: برای ایجاد کلید خارجی (Foreign Key).
$table->foreignId('user_id')->constrained(); // رابطه به جدول users
- متدهای تغییر ستونها
renameColumn: تغییر نام یک ستون.
Schema::table('posts', function (Blueprint $table) {
$table->renameColumn('old_column', 'new_column');
});
dropColumn: حذف یک ستون از جدول.
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('author');
});
change: تغییر نوع یک ستون.
Schema::table('posts', function (Blueprint $table) {
$table->string('title', 255)->change();
});
- متدهای کلیدها و ایندکسها
primary: ایجاد کلید اصلی (Primary Key) روی یک ستون یا چندین ستون.
$table->primary('id');
unique: ایجاد ایندکس منحصر به فرد.
$table->unique('email');
index: ایجاد ایندکس معمولی.
$table->index('title');
foreign: ایجاد کلید خارجی (Foreign Key) و مشخص کردن رابطه.
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
- متدهای مربوط به زمانبندی و ستونهای زمانی
timestamps: ایجاد ستونهای created_at و updated_at.
$table->timestamps();
softDeletes: ایجاد ستون deleted_at برای حذف نرم (Soft Delete).
$table->softDeletes();
timestampTz: ایجاد یک ستون timestamp که شامل زمانمحلی است.
$table->timestampTz('event_time');
- متدهای مربوط به ایندکسها و کلیدهای خارجی
dropPrimary: حذف کلید اصلی.
$table->dropPrimary('primary_key_name');
dropUnique: حذف ایندکس منحصر به فرد.
$table->dropUnique('column_name');
dropIndex: حذف ایندکس معمولی.
$table->dropIndex('column_name');
dropForeign: حذف کلید خارجی.
$table->dropForeign('user_id');
- متدهای اضافی
dropIfExists: حذف جدول تنها در صورت وجود.
Schema::dropIfExists('posts');
hasTable: بررسی اینکه آیا یک جدول وجود دارد یا نه.
if (Schema::hasTable('posts')) {
// جدول وجود دارد
}
hasColumn: بررسی اینکه آیا یک ستون در جدول وجود دارد یا نه.
if (Schema::hasColumn('posts', 'title')) {
// ستون وجود دارد
}
جمعبندی
این متدها ابزارهای بسیار مفیدی برای مدیریت پایگاه داده در لاراول هستند که به شما این امکان را میدهند که ساختار دادههای خود را به راحتی و به صورت برنامهنویسی کنترل کنید. این متدها را میتوان در مایگریشنها برای ایجاد، تغییر، حذف و مدیریت جداول و ستونها استفاده کرد.
seeder در لاراول
در لاراول، Seederها به شما کمک میکنند تا دادههای آزمایشی یا اولیه را به جداول پایگاه داده وارد کنید. این کار برای پر کردن پایگاه داده با دادههای نمونه بسیار مفید است، بهخصوص در طول توسعه یا تست پروژهها.
ایجاد Seeder جدید
برای ایجاد یک Seeder جدید در لاراول، از دستور زیر استفاده میکنیم:
php artisan make:seeder SeederName
این دستور یک فایل Seeder جدید در پوشه database/seeders ایجاد میکند.
ساختار یک Seeder
یک فایل Seeder معمولاً شامل متدی به نام run() است که در آن دادهها به جداول پایگاه داده اضافه میشوند. در این متد میتوانید از مدلهای Eloquent یا Query Builder برای وارد کردن دادهها به پایگاه داده استفاده کنید
مثال از Seeder برای جدول posts
فرض کنید میخواهید به جدول posts دادههای آزمایشی وارد کنید. برای این کار ابتدا یک Seeder جدید ایجاد میکنیم:
php artisan make:seeder PostsTableSeeder
سپس در فایل PostsTableSeeder.php، کد زیر را اضافه میکنیم:
use App\Models\Post; // مدل Post برای وارد کردن دادهها
use Illuminate\Database\Seeder;
class PostsTableSeeder extends Seeder
{
public function run()
{
// اضافه کردن یک پست به صورت دستی
Post::create([
'title' => 'اولین پست',
'body' => 'این یک پست آزمایشی است.'
]);
// استفاده از faker برای اضافه کردن دادههای تصادفی
\App\Models\Post::factory(10)->create(); // ایجاد 10 پست تصادفی
}
}
در این مثال، ابتدا یک پست به صورت دستی اضافه کردهایم و سپس با استفاده از Factories دادههای تصادفی ایجاد میکنیم (که در ادامه بیشتر توضیح میدهیم).
اجرای Seeder
برای اجرای Seederهایی که ایجاد کردهاید، از دستور زیر استفاده میکنید:
php artisan db:seed
اگر میخواهید فقط یک Seeder خاص را اجرا کنید، میتوانید نام آن را مشخص کنید:
php artisan db:seed --class=PostsTableSeeder
Factory در Seeder
برای تولید دادههای تصادفی و آزمایشی، میتوانید از Factories استفاده کنید. Factoryها به شما کمک میکنند تا مدلهای خود را با دادههای تصادفی پر کنید. به عنوان مثال، اگر مدل Post دارید، میتوانید یک Factory برای آن بسازید.
ایجاد Factory برای مدل
برای ایجاد یک Factory جدید برای مدل Post از دستور زیر استفاده میکنیم:
php artisan make:factory PostFactory --model=Post
این دستور یک فایل Factory جدید در پوشه database/factories ایجاد میکند. در این فایل، میتوانید نحوه ساخت دادههای تصادفی را تعریف کنید:
namespace Database\Factories;
use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
protected $model = Post::class;
public function definition()
{
return [
'title' => $this->faker->sentence,
'body' => $this->faker->paragraph,
];
}
}
در این مثال، از Faker برای تولید عنوان و بدنه تصادفی استفاده کردهایم.
ارتباط بین Seeder و Factory
زمانی که از ()Post::factory(10)->create در Seeder استفاده میکنیم، این به لاراول میگوید که 10 نمونه تصادفی از مدل Post ایجاد کند.
فراخوانی Seederها در DatabaseSeeder
اگر میخواهید چند Seeder را در یک بار اجرا کنید، میتوانید همه Seederها را در فایل DatabaseSeeder.php فراخوانی کنید. این فایل به طور پیشفرض در پوشه database/seeders وجود دارد.
در فایل DatabaseSeeder.php، میتوانید Seederهایی که میخواهید اجرا شوند را فراخوانی کنید:
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call([
PostsTableSeeder::class,
// سایر Seederها
]);
}
}
سپس با اجرای دستور php artisan db:seed تمام Seederها اجرا میشوند.
نکات اضافی
اگر میخواهید تمامی دادههای جدول را قبل از اجرای Seederها پاک کنید، میتوانید از دستور php artisan migrate:fresh –seed استفاده کنید که جدولها را حذف کرده و سپس دادههای جدید را وارد میکند.
برای استفاده از دادههای اولیه یا مرتبط با کاربر در Seederها میتوانید از Auth یا Model Factories بهره ببرید.