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

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

4 پاسخ
  • مهدی مهری30 مرداد ۱۴۰۰

     

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

    جدول محصولات : 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
           ]);
    
       }

     

     

     

  • قاسم بساکی31 مرداد ۱۴۰۰

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

    شما میخوای رابطه 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)
  • قاسم بساکی31 مرداد ۱۴۰۰
    $cards = product::all()->first()->categories()->where('id',$this->categoryid )->paginate(12)
    or
    $cards = product::all()[0]->categories()->where('id',$this->categoryid )->paginate(12)
  • مهدی مهری1 شهريور ۱۴۰۰

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

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

    product::whereHas('categories', function ($query) {$query->where('category_id', $this->categoryid);})->get();