سلام دوستان.
برای فروشگاهم یه بخش سرچ دارم..
میخوام عبارتی که توی فیلد سرچ مینویسم هم توی عنوان محصول هم توضیحات و علاوه بر اینها، محصولاتی که تگ یا همون برچسبی با این عنوان سرچ شده دارن رو هم برام بیاره..
دو مورد اول یعنی توی عنوان و توضیحات که اوکیه و درست کار میکنه..
فقط مسئله اینجاست که چون تگ ها جدول جدایی دارند و تگ های محصول داخل یک جدول 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);
احتیاج به کوئری داری که فیلدهای 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 فراخوانی کنی
$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 همون ریلیشن تگ ها در مدل پرداکت هستش
آقای بیات یخورده گیج شدم ازین بابت که الان سه تا جدول تصور کنید:
1- جدول محصولات:
products
2- جدول تگ ها:
tags
که شامل دو فیلد id و تگ هست (عنوان برچسب ها اینجا ذخیره میشه)
3- جدول واسط تگ و محصول:
tag_product
که شامل دو فیلد tag_id و product_id هستش
برای یک محصول میتونه چندین تگ باشه و همچنین برای یک تگ چندین محصول ثبت شده باشه..
الان توی کوئری من عبارت سرچ شده رو دارم که داخل
$query
از سمت کاربر اومده..
ولی توی جدول واسطم id اون تگ رو دارم..
این مسئله منو گیج کرده...
امیدوارم منظورمو تونسته باشم برسونم
@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 %بتمن%))
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟