اخیراً به هوتن تسکی داده شده که باید دیتابیسی پر از جدول با روابط متعدد ایجاد کند. او که از این کار خسته شده، ایدهای به ذهنش رسیده که این فرایند را خودکار کند. برای این کار به هوتن کمک کنید.
جزئیات پروژه
پروژهی اولیه را از این لینک دانلود کنید.
ساختار فایلها
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
راهاندازی پروژه
برای اجرای پروژه، باید php
و composer
را از قبل نصب کرده باشید.
- ابتدا پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
- دستور
composer install
را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید. - برای اجرای تستهای نمونه، میتوانید از دستور
php artisan test
استفاده کنید.
شما باید دستوری را ایجاد کنید تا مدلها و مایگریشنهایی را با جزئیاتی که در ادامه گفته میشود، ایجاد کند.
قالب دستوری که میسازید باید بهصورت زیر باشد:
php artisan make:custom-model MODEL_NAME_1 MODEL_NAME_2 --type=RELATION_TYPE
دستور فوق به این معنی است که باید دو مدل با نامهای 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
با اجرای دستور فوق، باید فایلهای 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
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);
}
}
همچنین مایگرشنهای مورنیاز مدلها و رابطهشان باید ایجاد شود:
محتویات مایگریشنها
class CreateAuthorsTable extends Migration
{
public function up()
{
Schema::create('authors', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('authors');
}
}
class CreateBooksTable extends Migration
{
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('books');
}
}
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');
}
}
نکتهی مهمی که باید به آن دقت کنید نام روابط در مدلهاست، که باید بهصورت زیر قرار دهید:
- اگر نوع رابطه مفرد به مفرد بود نام رابطه باید بهصورت مفرد کلاس هدف قرار گیرد مثلا فرض کنید بین دو مدل
User
وName
رابطه یکبهیک برقرار است پس نام رابطه در مدلUser
باید برابرname
قرار گیرد. - اگر نوع رابطه مفرد به جمع بود نام رابطه باید بهصورت جمع کلاس هدف قرار گیرد مثل مدلهای
Author
وBook
مثال ذکر شده در همین سوال.
تضمین میشود که در دستور نام مدلها بهصورت صحیح داده میشوند.
نکات
- برای هر رابطه باید مدل و مایگریشن متناسب با نوع رابطه ایجاد شود.
- در نامگذاری جداول، باید از convention لاراول پیروی کنید.
- تمامی این فرایندها باید بهصورت خودکار انجام شود و در داوری، ساخت مدلهای مختلف تست میشود.
- برای ساخت مایگریشنها حتماً به زمان ساخت مایگریشنها دقت کنید تا بهترتیب اجرا شوند.
- شما تنها مجاز به اعمال تغییرات در پوشه
app
و در صورت نیازstubs
هستید.
آنچه باید آپلود کنید
پس از پیادهسازی موارد خواستهشده، پوشهی app
و پوشهی stubs
را (در صورت وجود) زیپ کرده و آپلود کنید.
ارسال پاسخ برای این سؤال