سوال در مورد Eloquent و رابطه ها
پاسخ ها
مهدی مهری
سلام . میدونم سوالم ربطی به لایوایر نداره . ولی گیج شدم میشه راهنمایی بفرمائید
جدول محصولات : 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
]);
}
قاسم بساکی
سلام خدمت شما دوست عزیز
شما میخوای رابطه 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)
قاسم بساکی
$cards = product::all()->first()->categories()->where('id',$this->categoryid )->paginate(12)
or
$cards = product::all()[0]->categories()->where('id',$this->categoryid )->paginate(12)
مهدی مهری
ممنون استاد گرامی
بعد از جستجوی فراوان از این قطعه کد استفاده کردم
product::whereHas('categories', function ($query) {$query->where('category_id', $this->categoryid);})->get();