علی قاسمی
2 سال پیش توسط علی قاسمی مطرح شد
3 پاسخ

کوئری فیلتر کردن داده ها در رابطه چند به چند لاراول

سلام
یک جدول دارم به اسم محصولات و یک جدول دیگر به اسم ویژگی ها که دارای رابطه چند به چند هستند.

میخواستم یک کوئری بنویسم که محصولاتی رو بهم برگردونه که مثلا ویژگی های 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 داخل حلقه قرار بگیره هیچی پیدا نمیکنه)
لطفا راهنماییم کنید


ثبت پرسش جدید
علی قاسمی
@ali.gha3mi75 2 سال پیش مطرح شد
0

مشکل حل شد. باید به ازای هر ویژگی یک بار 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);
        });
    }

فرید عقیلی
تخصص : طراح و توسعه دهنده وب
@faridaghili 2 سال پیش مطرح شد
0

کوئری داخل whereHas لازم نیست loop باشه، فقط به کوئری whereIn بذار و آرایه params رو بهش بده.


علی قاسمی
@ali.gha3mi75 2 سال پیش مطرح شد
0

ممنون از پاسخت
ولی وقتی از whereIn استفاده میکنم به صورت OR عمل میکنه و محصولاتی رو بهم نشون میده که یا ویژگی 2 رو دارند یا 3 یا 11..
من میخام به صورت AND باشه یعنی فقط محصولاتی رو برگدونه که همه ویژگی های مورد نظر رو باهم داشته باشند


علی قاسمی
@ali.gha3mi75 2 سال پیش مطرح شد
0

مشکل حل شد. باید به ازای هر ویژگی یک بار 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);
        });
    }

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام