سوال در مورد Eloquent و رابطه ها

سوال شده توسط: مهدی مهری

تاریخ ثبت: ۱۴۰۰/۰۵/۳۰

بازدید: 1,528

پاسخ: 4

تگ: Laravel


سلام . میدونم سوالم ربطی به لایوایر نداره . ولی گیج شدم میشه راهنمایی بفرمائید جدول محصولات : id , name , .... جدول دسته بندی : id , name , ... جدول واسط : id , product_id , category_id روابط رو تو مدل ها ست کردم دستور استخراج اطلاعات محصولات با داشتن categoryid رو می خواستم . خودم اینو نوشتم که کار نکرد $cards = product::all()->categories()->where('id',$this->categoryid )->paginate(12)
پاسخ ها
user

مهدی مهری

 

سلام . میدونم سوالم ربطی به لایوایر نداره . ولی گیج شدم میشه راهنمایی بفرمائید

جدول محصولات : id , name , ....

جدول دسته بندی : id , name , ...

جدول واسط : id , product_id , category_id  

روابط رو تو مدل ها ست کردم

دستور استخراج اطلاعات محصولات با داشتن categoryid رو می خواستم .

خودم اینو نوشتم که کار نکرد  

 

$cards = product::all()->categories()->where('id',$this->categoryid )->paginate(12)

-------------model product ---------------//

<?php

namespace App\Models;

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

class product extends Model
{
   public function categories()
   {
       return $this->belongsToMany(category::class);
   }
}


//-------------------model category------------------------------


namespace App\Models;

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

class category extends Model
{
   public function products()
   {
       return $this->belongsToMany(product::class);
   }
}




//---------------controller--------------------------


namespace App\Http\Livewire\Cards;

use Livewire\Component;
use App\Models\category;
use App\Models\product;
use Livewire\WithPagination;

class Cards extends Component
{
   use WithPagination;

   protected $paginationTheme = 'tailwind';


   public function render()
   {

       $cards =  product::all()->categories()->where('id', $this->categoryid)->paginate(12) ;

       return view('livewire.cards.cards', [
           'cards' => $cards
       ]);

   }

 

 

 

دریافت فایل ضمیمه
user

قاسم بساکی

 سلام خدمت شما دوست عزیز 

شما میخوای رابطه many to many برقرار کنی که خیلی سادس

شما نیاز به foreign key  در دو جدول اصلی نداری و فقط نیاز به یک جدول واسط داری (paivot table) که نحوه نام گذاری اون خیلی مهمه که اگر شما میخوای ارتباط بین دو جدول  role , user برقرار کنی باید به ترتیب حروف الفبا نوشته بشن (role_user) 

این لینک کمکتون می کنه

https://laravel.com/docs/8.x/eloquent-relationships#many-to-many

 

حالا اگر همه رو درست انجام داده باشی باید به درستی کار کنه…

 

یک نکته دیگه شما اینطوری صدا زدی:

$cards = product::all()->categories()->where('id',$this->categoryid )->paginate(12)

یعنی شما داری میگی همه محصولات رو به من بده که یک آرایس…

حالا از این آرایه ، دسته بندیشو بهم بده…

که این درخواست درست نیست… شما یاسد از یک آبجکت ، درخواست دسته بندی کنید نه از یک آرایه

مثلا اینطوری بنویسید:

$cards = product::all()first()->categories()->where('id',$this->categoryid )->paginate(12)
user

قاسم بساکی

$cards = product::all()->first()->categories()->where('id',$this->categoryid )->paginate(12)
or
$cards = product::all()[0]->categories()->where('id',$this->categoryid )->paginate(12)
user

مهدی مهری

ممنون استاد گرامی 

بعد از جستجوی فراوان از این قطعه کد استفاده کردم

product::whereHas('categories', function ($query) {$query->where('category_id', $this->categoryid);})->get();
برای ثبت پاسخ باید خود شوید