یلدا ادامه داره... ❤️ ۴۰ درصد تخفیف همه دورهها
استفاده از تخفیفهاسلام
یک جدول دارم به اسم محصولات و یک جدول دیگر به اسم ویژگی ها که دارای رابطه چند به چند هستند.
میخواستم یک کوئری بنویسم که محصولاتی رو بهم برگردونه که مثلا ویژگی های 2و3و11 رو همزمان باهم داشته باشند. الان دستور زیر رو نوشتم
$params = [2,3,11];
$products = Product::with('photos')
->whereHas('attributeValues', function ($q) use ($params) {
foreach($params as $p) {
$q->where('attributevalue_id', $p);
}
})
->whereIn('category_id', $ids)
->orderByRaw($sortBy)
->paginate($paginate);
ولی این کوئری که نوشتم داده خالی برمیگردونه.(اگه اون آرایه param یک مقدار داشته باشه درست عمل میکنه ولی اگه بیشتر از یه دونه where داخل حلقه قرار بگیره هیچی پیدا نمیکنه)
لطفا راهنماییم کنید
مشکل حل شد. باید به ازای هر ویژگی یک بار wherehas استفاده کنم.
کنترلر:
$products = Product::with('photos','attributeValues')
->MultiFilterAttr($params['attributes_checked'])
->whereIn('category_id', $ids)
->orderByRaw($sortBy)
->paginate($params['show']);
مادل:
public function scopeMultiFilterAttr($query,$attr){
for($i=0 ; $i<count($attr) ; $i++){
$query->FilterAttr($attr[$i]);
}
}
public function scopeFilterAttr($query,$filter){
$query->whereHas('attributeValues', function ($q) use ($filter) {
$q->where('attributevalue_id' , $filter);
});
}
کوئری داخل whereHas لازم نیست loop باشه، فقط به کوئری whereIn بذار و آرایه params رو بهش بده.
ممنون از پاسخت
ولی وقتی از whereIn استفاده میکنم به صورت OR عمل میکنه و محصولاتی رو بهم نشون میده که یا ویژگی 2 رو دارند یا 3 یا 11..
من میخام به صورت AND باشه یعنی فقط محصولاتی رو برگدونه که همه ویژگی های مورد نظر رو باهم داشته باشند
مشکل حل شد. باید به ازای هر ویژگی یک بار wherehas استفاده کنم.
کنترلر:
$products = Product::with('photos','attributeValues')
->MultiFilterAttr($params['attributes_checked'])
->whereIn('category_id', $ids)
->orderByRaw($sortBy)
->paginate($params['show']);
مادل:
public function scopeMultiFilterAttr($query,$attr){
for($i=0 ; $i<count($attr) ; $i++){
$query->FilterAttr($attr[$i]);
}
}
public function scopeFilterAttr($query,$filter){
$query->whereHas('attributeValues', function ($q) use ($filter) {
$q->where('attributevalue_id' , $filter);
});
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟