برچسب: روابط laravel

  • کارکردن با pivot table ها یا جداول محور در laravel

    مجددا باید بگم که من همه کارام رو توی لاراول ۵٫۰٫۰ انجام میدم 🙂

    امروز میخوام در مورد یک چیز خیلی مهم توی لاراول صحبت کنم و اونم نحوه ی ارتباط برقرار کردن چند به چند بین دو جدول در لاراول ۵ هست.

    یک مثال کاملا واقعی در مورد رابطه های چند به چند در لاراول

    توی داکیومنت رسمی لاراول مثالی که واسه روابط چند به چند اومده ، رابطه ی role و user هست که یک یوزر میتونه متعلق به چند نقش باشه و برعکس، یعنی یک نقش مثل ادمین هم میتونه متعلق به چند کاربر باشه. من یه مثال ملموس تر براتون میزنم : رابطه ی محصولات و فروشگاهها رو در نظر بگیرید. شما نیاز دارید که بدونید مثلا گوشی فلان رو چه فروشگاههایی دارن و همچنین نیاز دارید بدونید که فلان فروشگاه چه گوشیهایی داره.

    $Shop->products();//for grab products of a shop...
    $Product->shops();//and reverse...

    جدول های مورد نظر میتونن به شکل زیر باشن :

    shops
    – id
    – name
    products
    – id
    – name
    product_shop
    – product_id
    – shop_id

    برای اینکه بین ذو جدول رابطه چند به چند بوجود بیاد ، بهترین راه استفاده از یک جدول میانی هست که ارتباط بین دو جدول رو تشکیل بده. این جدول حداقل باید دو فیلد داشته باشه ، که آیدی دو ریکورد از دو جدول رو به هم نسبت بده.

    برای اینکه این جدول رو درست کنیم میتونیم از مایگریشن های خود لاراول استفاده کنیم. مثلا در یک وبلاگ، پست ها و تگ ها دارای رابطه چند به چند هستند که جدول post_tag رو میتونیم به صورت زیر بسازیم :

    Schema::create('post_tag', function(Blueprint $table)
    {
    	$table->integer('post_id')->unsigned();
    	$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
    
    	$table->integer('tag_id')->unsigned();
    	$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
    });

    جدول  post_tag رو اصطلاحا بهش میگن pivot table. نام جدول pivot باید بصورت first_second باشه که first نام جدول اول و second نام جدول دوم هست. ترتیب هم باید بر اساس حروف الفبا باشه.  بصورت پیشفرض جدول pivot دوتا فیلد داره : post_id و tag_id که میتونید فیلد های بیشتری هم بهش اضافه کنید . مثلا برای اینکه شما یک پلن رو به یک کاربر اختصاص بدید میتونید تاریخ پایان پلن رو هم توی جدول میانی یا همون pivot ذخیره کنید. برای بدست آوردن مقدار فیلد های دیگه هم میتونید از این روش استفاده کنید :

    public function products()
    {
        return $this->belongsToMany('App\Products')
        	->withPivot('products_amount', 'price')
        	->withTimestamps();
    }