JBolouri
4 سال پیش توسط JBolouri مطرح شد
6 پاسخ

جست و جوی محصول در لاراول بر اساس عنوان و توضیحات و تگ ها

سلام دوستان.
برای فروشگاهم یه بخش سرچ دارم..

میخوام عبارتی که توی فیلد سرچ مینویسم هم توی عنوان محصول هم توضیحات و علاوه بر اینها، محصولاتی که تگ یا همون برچسبی با این عنوان سرچ شده دارن رو هم برام بیاره..

دو مورد اول یعنی توی عنوان و توضیحات که اوکیه و درست کار میکنه..

فقط مسئله اینجاست که چون تگ ها جدول جدایی دارند و تگ های محصول داخل یک جدول pivot به نام tag_product هستند.. توی این جدول هم فقط product_id و tag_id رو دارم..

چطوری توی کد زیر این کار رو انجام بدم که اگر محصولی تگی مثل عبارت جست و جو شده داشته باشه بازم بیاره برامون؟

$products = Product::orderBy('id', 'desc')
            ->where('status',1)->where('title', 'like',"%$query%")
            ->orWhere('describe', 'like',"%$query%" )
            ->paginate(48);

ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

احتیاج به کوئری داری که فیلدهای title و describe رو جستجو کنه
و یا رابطه ای (رابطه چند به چند محصول و تگ) رو جستجو کنه که اسم تگش برابر با عبارت جستجو شده باشه

برای جستجو در Relationship ها از متد whereHas استفاده میشه
همچنین وقتی یه رابطه چند به چند رو فراخوانی کنی، اطلاعات تگ رو میگیری و میتونی جستجو روش انجام بدی

کوئریش کم و بیش شبیه به زیره

Product::where(function($q) use ($query) {
        $q->where('title', 'like',"%$query%")
          ->orWhere('describe', 'like',"%$query%");
})->orWhere('tags', function($q) use ($query) {
        $q->where('tag_name_column', 'like',"%$query%");
})
->paginate(48);

فقط به جای tag_name_column ممکنه لازم باشه رابطه چند به چند رو با pivot فراخوانی کنی


مهرداد
@mehrdadroshanraee69 4 سال پیش مطرح شد
1
            $products = Product::when($request->search, function ($query, $search) {
                return $query->whereHas('tags' , function ($query) use ($search) {
                    $query->where('tag_name' , 'LIKE' , "%{$search}%")
                })->orWhere('title', 'LIKE' , "%{$search}%") 
                ->orWhere('description', 'LIKE' , "%{$search}%");
            })->latest()->paginate(8);

اون مقدار tags همون ریلیشن تگ ها در مدل پرداکت هستش


JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

@ali.bayat

آقای بیات یخورده گیج شدم ازین بابت که الان سه تا جدول تصور کنید:

1- جدول محصولات:
products

2- جدول تگ ها:
tags
که شامل دو فیلد id و تگ هست (عنوان برچسب ها اینجا ذخیره میشه)

3- جدول واسط تگ و محصول:
tag_product
که شامل دو فیلد tag_id و product_id هستش

برای یک محصول میتونه چندین تگ باشه و همچنین برای یک تگ چندین محصول ثبت شده باشه..

الان توی کوئری من عبارت سرچ شده رو دارم که داخل
$query
از سمت کاربر اومده..
ولی توی جدول واسطم id اون تگ رو دارم..

این مسئله منو گیج کرده...
امیدوارم منظورمو تونسته باشم برسونم


JBolouri
@javadbolouri72 4 سال پیش آپدیت شد
0

@ali.bayat
@mehrdadroshanraee69

الان دقیقا اینو نوشتم:

 $products = Product::orderBy('id', 'desc')
            ->where('status',1)
            ->where(function($q) use ($query) {
                $q->where('title', 'like',"%$query%")
                  ->orWhere('describe', 'like',"%$query%");
                })->orWhere('tags', function($q) use ($query) {
                        $q->where('tag', 'like',"%$query%");
                })
                ->paginate(48);

این ارور رو میده:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tags' in 'where clause' (SQL: select count(*) as aggregate from `products` where `status` = 1 and (`title` like %بتمن% or `describe` like %بتمن%) or `tags` = (select * where `tag` like %بتمن%))

JBolouri
@javadbolouri72 4 سال پیش مطرح شد
0

آها الان درست شد
orWhere
آخری رو به
orWhereHas
تغییر دادم درست شد

ممنون از کمکتون


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

orWhere آخری قرار بود orWhereHas باشه
موفق باشی


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

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