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

جزئیات پروژه

پروژه‌ی اولیه را از این لینک دانلود کنید.

ساختار فایل‌ها

model-maker
├── app
├── bootstrap
├── config
├── database
├── public
├── resources
├── routes
├── storage
├── tests
├── README.md
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── phpunit.xml
├── server.php
└── webpack.mix.js
Plain text

راه‌اندازی پروژه

برای اجرای پروژه، باید php و composer را از قبل نصب کرده باشید.

  • ابتدا پروژه‌ی اولیه را دانلود و از حالت فشرده خارج کنید.
  • دستور composer install را در پوشه‌ی اصلی پروژه برای نصب نیازمندی‌ها اجرا کنید.
  • برای اجرای تست‌های نمونه، می‌توانید از دستور php artisan test استفاده کنید.

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

قالب دستوری که می‌سازید باید به‌صورت زیر باشد:

php artisan make:custom-model MODEL_NAME_1 MODEL_NAME_2 --type=RELATION_TYPE
Shell

دستور فوق به این معنی است که باید دو مدل با نام‌های MODEL_NAME_1 و MODEL_NAME_2 ایجاد شوند و بین این دو مدل رابطه‌ای از نوع RELATION_TYPE برقرار شود. مقدار RELATION_TYPE می‌تواند یکی از مقادیر 11، 1n یا nn باشد. 11 به‌معنی رابطه‌ی One to One ، 1n به‌معنی رابطه‌ی One to Many و nn به‌معنی رابطه‌ی Many to Many است.

مثال

فرض کنید دستور زیر اجرا می‌شود:

php artisan make:custom-model Author Book --type=nn
Shell

با اجرای دستور فوق، باید فایل‌های Author.php و Book.php در دایرکتوری app/Models ایجاد شوند. محتویات فایل‌های این دو کلاس باید به‌صورت زیر باشد:

محتویات مدل‌ها

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Author extends Model
{
    use HasFactory;

    public function books()
    {
        return $this->belongsToMany(Book::class);
    }
}

PHP
app/Models/Author.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    use HasFactory;

    public function authors()
    {
        return $this->belongsToMany(Author::class);
    }
}

PHP
app/Models/Book.php

هم‌چنین مایگرشن‌های مورنیاز مدل‌ها و رابطه‌شان باید ایجاد شود:

محتویات مایگریشن‌ها

class CreateAuthorsTable extends Migration
{
    public function up()
    {
        Schema::create('authors', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::dropIfExists('authors');
    }
}
PHP
database/migrations/2021_11_16_202919_create_authors_table.php
class CreateBooksTable extends Migration
{
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::dropIfExists('books');
    }
}

PHP
database/migrations/2021_11_16_202921_create_books_table.php
class CreateAuthorBookTable extends Migration
{
    public function up()
    {
        Schema::create('author_book', function (Blueprint $table) {
            $table->id();
            $table->foreignId('author_id')->constrained()->onDelete('cascade');
            $table->foreignId('book_id')->constrained()->onDelete('cascade');
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::dropIfExists('author_book');
    }
}

PHP
database/migrations/2021_11_16_202922_create_author_book_table.php

نکته‌ی مهمی که باید به آن دقت کنید نام روابط در مدل‌هاست، که باید به‌صورت زیر قرار دهید:

  • اگر نوع رابطه مفرد به مفرد بود نام رابطه باید به‌صورت مفرد کلاس هدف قرار گیرد مثلا فرض کنید بین دو مدل User و Name رابطه یک‌به‌یک برقرار است پس نام رابطه در مدل User باید برابر name قرار گیرد.
  • اگر نوع رابطه مفرد به جمع بود نام رابطه باید به‌صورت جمع کلاس هدف قرار گیرد مثل مدل‌های Author و Book مثال ذکر شده در همین سوال.

تضمین می‌شود که در دستور نام مدل‌ها به‌صورت صحیح داده می‌شوند.

نکات

  • برای هر رابطه باید مدل و مایگریشن متناسب با نوع رابطه ایجاد شود.
  • در نام‌گذاری جداول، باید از convention لاراول پیروی کنید.
  • تمامی این فرایند‌ها باید به‌صورت خودکار انجام شود و در داوری، ساخت مدل‌های مختلف تست می‌شود.
  • برای ساخت مایگریشن‌ها حتماً به زمان ساخت مایگریشن‌ها دقت کنید تا به‌ترتیب اجرا شوند.
  • شما تنها مجاز به اعمال تغییرات در پوشه app و در صورت نیاز stubs هستید.

آن‌چه باید آپلود کنید

پس از پیاده‌سازی موارد خواسته‌شده، پوشه‌ی app و پوشه‌ی stubs را (در صورت وجود) زیپ کرده و آپلود کنید.


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.