راکت
حل شده

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

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 داخل حلقه قرار بگیره هیچی پیدا نمیکنه)
لطفا راهنماییم کنید

ثبت پرسش جدید

پاسخ‌ها

3
علی قاسمی
علی قاسمی
@ali.gha3mi75
بهترین پاسخ

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

تخصص: طراح و توسعه دهنده وب

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

علی قاسمی
علی قاسمی
@ali.gha3mi75

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

شاید پاسخ شما همین‌جا باشد

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

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