آموزش رابطه یک به چند در لاراول ، در این پست از تجاری اپ قصد داریم به معرفی رابطه One To Many در لاراول بپردازیم و در قالب یک مثال به شما رابطه One To Many در لاراول را آموزش دهیم.با ما همراه باشید.
در این پست همراه با یک مثال ما خواهیم دید که چگونه می توان یک رابطه One To Many در لاراول ایجاد کرد.
رابطه یک به چند یا One To Many که با عنوان hasMany نیز شناخته شده است یک ردیف از یک جدول در پایگاه داده را به چندین ردیف از جداول دیگری در پایگاه داده متصل می کند.
در Eloquent لاراول یک مدل می تواند دارای چندین مدل باشد که رابطه یک به چند است.به عنوان مثال ، در سناریو یک فروشگاه الکترونیکی یک مدل Brand می تواند دارای چندین مدل Product باشد و یک مدل Product معلق به یک مدل Brand می باشد. دیاگرام مربوط به این رابطه را در زیر مشاهده می کنید:
رابطه یک به چند همانند رابطه یک به یک ساده می باشد.که ما قبلا در وب سایت تجاری اپ رابطه یک به یک در لاراول را آموزش دادیم.در این پست ما با یک مثال ساده و در عین حال عملی رابطه One To Many را به شما آموزش خواهیم داد.
برای پیاده سازی رابطه یک به چند در لاراول ما به دو جدول در پایگاه داده نیاز داریم: products و brands
توجه:
ما با این فرض آموزش را ادامه می دهیم که شما لاراول جدیدی را نصب کرده اید و تنظیمات مربوط به پایگاه داده در فایل .env را نیز انجام داده اید.
برای این کار می توانید در صورت نیاز از آموزشی که ما قبلا در ابن رابطه در سایت قرار داده ایم استفاده کنید: آموزش نصب لاراول به همراه تنظیمات اولیه
برای ایجاد مدل ها و migration ها دو دستور زیر را در ترمینال خود اجرا کنید:
php artisan make:model Brand -m
php artisan make:model Product -m
با اجرای دستور بالا دو مدل با نام های Brand و Product در فولدر app پروژه لاراول شما ایجاد خواد شد.همچنین اگر به پوشه database/migrations بروید دو migration جدیدی که ایجاد شده را مشاهده خواهید کرد
مدل ها و migration هایی که اخیرا ایجاد کردید مانند زیر خواهند بود:
Brand Model :
// Brand Model
namespace App;
use Illuminate\Database\Eloquent\Model;
class Brand extends Model
{
//
}
Brand Migration:
// Brand Migration
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateBrandsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('brands', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('brands');
}
}
Product Model:
// Product Model
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
//
}
Product Migration:
// Product Migration
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProductsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('products');
}
}
بعد از اینکه مدل ها و migration ها را ایجاد کردید متد up() در migration های brand و product را مانند زیر بروزرسانی کنید:
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('brands', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->text('description');
$table->timestamps();
});
}
در کد بالا، ما چند فیلد به جدول brand اضافه کردیم.
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('brand_id')->unsigned();
$table->foreign('brand_id')
->references('id')->on('brands')
->onDelete('cascade');
$table->string('name');
$table->string('slug');
$table->double('price');
$table->integer('qty');
$table->text('description');
$table->timestamps();
});
}
در کدهای بالا، ما چند فیلد table به جدول products اضافه کرده ایم. یک مورد که باید در کدهای بالا به آن توجه کنید ستون brand_id است که یک کلید خارجی برای ستون Id جدول brands می باشد.
اکنون دستور زیر را برای ایجاد جداول brands و products در پایگاه داده اجرا کنید:
php artisan migrate
پس از ایجاد جداول brands و products ، به سراغ تعریف رابطه یک به چند در مدل ها می رویم.
فایل مدل app/Brand.php را باز کنید و یک تابع جدید با نام products() به آن اضافه کنید ، این تابع رابطه hasMany را بر می گرداند.مانند زیر:
// Brand Model
namespace App;
use Illuminate\Database\Eloquent\Model;
class Brand extends Model
{
public function products()
{
return $this->hasMany(Product::class);
}
}
توجه:
برای مدل Brand یک رابطه one to many بازگردانده می شود که بیش از یک رکورد از مدل Product را بر می گرداند ، به همین دلیل ما تابع را به صورت جمع یعنی products نامگذاری کردیم.در ادامه و زمانی که ما رابطه معکوس یک به چند را در مدل Product تعریف می کنیم ما از یک اسم مفرد مانند brand برای تابع استفاده می کنیم.هر محصول یا product دارای یک brand است به همین دلیل ما باید از اسم مفرد استفاده کنیم.
همانطور که می بینید در متد products() رابطه hasMany با مدل Product تعریف کرده ایم.
همانطور که ما رابطه hasMany در مدل Brand تعریف کردیم که رکوردهای مربوط به مدل Product را برمی گرداند ، می توانیم رابطه معکوس نیز در مدل Product تعریف کنیم.
فایل مدل app/Product.php را باز کنید و یک تابع جدید با نام brand() به آن اضافه کنید ، این تابع برند مربوط به یک محصول را برمی گرداند.مانند زیر:
// Product Model
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
public function brand()
{
return $this->belongsTo(Brand::class);
}
}
همانطور که می بینید، در متد brand() رابطه belongs to برگردانده می شود که برند مرتبط با محصول را باز می گرداند.
برای ایجاد یک ارتباط بین دو مدل یا مرتبط کردن آنها ابتدا می توان یک آبجکت فرزند ایجاد کرد و سپس آن را با استفاده از آبجکت والد ذخیره کرد.
ابزار Tinker در لاراول:
ابزار Tinker برای مدیریت پایگاه داده متصل به پروژه لاراول به این فریمورک اضافه شده است. اگر تنظیمات پایگاه داده را در پروژه لاراول خود به درستی انجام داده باشید میتوانید از ابزار Tinker برای افزودن ، ویرایش و حذف اطلاعات استفاده کنیم.
با دستور زیر ابزار Tinker را باز میکنیم:
php artisan tinker
$brand = Brand::find(1);
$product = new Product;
$product->name = 'J5 pro';
$product->slug = 'j5-pro';
$product->price = '2000000';
$product->qty = 20;
$product->description = 'گوشی جی 5 پرو یکی از گوشی های برند سامسونگ می باشد!';
// Saving related model
$brand->products()->save($product);
ما همچنین می توانیم از متد saveMany () به جای save () استفاده کنیم.
هنگامی که رابطه ای را در مدل ها تعریف می کنیم ، می توانیم از مدل ها برای بازیابی رکوردهای مرتبط استفاده کنیم.هنگامی که رابطه ای را در مدل ها تعریف می کنیم ، می توانیم از مدل ها برای بازیابی رکوردهای مرتبط استفاده کنیم. در مثال ما ، برای یک برند خاص می توانیم از متد products() استفاده کنیم تا کلیه محصولات مرتبط با یک برند را بدست آوریم.
$brand = Brand::find(1);
$products = $brand->products;
هنگامی که ما سعی می کنیم محصولاتی را برای یک برند بدست آوریم ، لاراول به واسطه ID برند که در جدول products و در ستون brand_id این جدول می باشد (یک کلید خارجی می باشد) تمام محصولاتی که ID مربوط به برند آنها مطابق با ID برند موردنظر باشد را می گیرد.
به همین ترتیب ، می توانیم معکوس مدل رابطه را بازیابی کنیم.
$product = Product::find(1);
$brand = $product->brand;
dd($brand->name);
برای معکوس رابطه یک به چند، لاراول به واسطه ID برند در جدول brands رکوردهایی که مطابقت دارد را بر می گرداند.
ممکن است بخواهیم رکوردهای مرتبط را فیلتر کنیم و همچنین بخواهیم آنها را هنگام بازیابی مرتب کنیم.ما می توانیم در کوئری بازیابی خود ، متدها را بصورت زنجیره ای و متصل به هم بنویسم.
$brand = Brand::find(1);
$products = $brand->products()
->where('price', '>', '2500000')
->orderBy('name', 'asc')
->get();
در کوئری بالا ما همه ی محصولات مربوط به یک برند را گرفتیم.(البته جایی که قیمت هر محصول بیش از 2500000 باشد و رکوردها براساس نام به صورت صعودی مرتب می شوند)
حذف یک رابطه یک به چند مشابه ایجاد یک رابطه One To Many می باشد.ابتدا آبجکت parent که brand هست را می گیریم و سپس از متد products() برای حذف همه ی محصولات استفاده می کنیم. به عنوان مثال کد زیر را برای حذف همه محصولات برای یک برند خاص استفاده می کنیم :
$brand = Brand::find(1);
$brand->products()->delete();
امیدوارم این آموزش به شما کمک کرده باشد.