PDA

View Full Version : جستججو و مقایسه چند فیلد + جستجوی همزمان در جدول واسط



rahahost
یک شنبه 31 خرداد 1394, 11:24 صبح
با سلام و احترام خدمت شما دوست عزیز :)

در حال نوشتن سیستمی هستم که در بین کار به مشکل برخوردم و متاسفانه نتونستم حلش کنم !
ممنون میشم راهنماییم کنید .

ما درون سایت بخش اخبار داریم که هر خبر میتونه جند دسته بندی ( اقتصادی ، ورزشی ، علمی و ... ) داشته باشه که من برای این قسمت از جدول واسط استفاده کردم :
جدول خبر ها : posts
جدول دسته ها : category ( اسم جدول درون مدل تغییر دادم )
جدول واسط : post_category

خب ، با این حساب ، یک ارتباط یک به چند بینشون ایجاد کردم ( belongsToMany ) .

تا اینجایه کار من میتونم خبر های هر دسته رو نمایش بدم و همینطوری همه ی دسته های یک خبر رو !

مشکل اینجاست که بخوام جستجویی بر اساس چند فیلد و جدول واسط داشته باشم ، مثلا :

خبری که عنوان " تست " داره و درون دسته "اقتصادی " هست رو بهم نمایش بده !

منظورم اعمال دو یا چند فیلتر هست که دسته بندی هم شامل فیلتر باشه !

مثال دیگه :

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

ممنون میشم راهنماییم کنید .

imohammad
یک شنبه 31 خرداد 1394, 23:35 عصر
خب از چند دستور استفاده کن

$post = Post::where(...)->where(...);

rahahost
دوشنبه 01 تیر 1394, 00:11 صبح
خب از چند دستور استفاده کن

$post = Post::where(...)->where(...);

سلام .

دستوری که رابطه رو هم چک کنه مهمه !
ما درون جدول posts ، آی دی دسته رو نگه نمیداریم و از جدول واسط استفاده میکنیم که اگر درون جدول posts ذخیره میکردم ، با دستوری که گفتین میشد این کارو کرد !

الان مشکل اینجاست که میخوام از جدول واسط کمک بگیرم برای کوئری !

کد های من به شکل زیر هست :



$query = Post::orderBy('id' , 'desk');

if($description)
{
$query->Where('description' , 'LIKE' , '%'.$description.'%');
}

if($title)
{
$query->Where('title' , 'LIKE' , '%'.$title.'%');
}

if($category)
{
// مشکل اینجاست !
}

tuytoosh
دوشنبه 01 تیر 1394, 08:47 صبح
$catId = ...
$category = App\Cat::find($catId);
$customPosts = $category->posts()->where('title' , 'تست');

rahahost
دوشنبه 01 تیر 1394, 11:49 صبح
$catId = ...
$category = App\Cat::find($catId);
$customPosts = $category->posts()->where('title' , 'تست');


ممنون از شما اما فکر نکنم این روش برای کاری که منی میخوام انجام بدم مناسب باشه ، دلیلش اینه که :
1 - درون فرم جستجو ، ممکنه از دسته استفاده نشه ( یعنی سرچ بر اساس دسته بنده انجام نشه و شامل همه ی دسته ها بشه )
2 - اینطوری فشار به سایت بالا میره ( چون به اضای هر فیلد داره وصل میشه به جدول واسط )

نمیدونم استدلالم درسته یا نه اما فکر کنم این نباشه !

یکی از دوستان میگفت باید whereIn استفاده کنم ولی انجام دادمو جواب نداد !

nazanin_asadi_1
دوشنبه 01 تیر 1394, 12:01 عصر
خب شما با توجه به ورودی ها کوئری مورد نظرتون رو کامل کنید
یعنی وقتی کاربر یه متن رو سرچ میکنه کوئری رو بر اساس اون بسازین
وقتی گروه بندی رو هم اعمال کنه کوئری رو بر اساس اون بسازین

اینجوری خیلی بهتر کوئریتون اجرا میشه

همونجوری که خودت هم گفتی میتونی از مدل های دیگه ای هم استفاده کنی ولی بعضی وقتا بیشترشون اضافی هستن
بهترین کار همینه که کوئری رو توی php بر اساس داده های ورودی بسازین و اجراش کنین

rahahost
دوشنبه 01 تیر 1394, 23:47 عصر
از همه ی دوستان ممنون که سعی در کمکم داشتین :)

مشکل به دست آقا رضا خدادادی عزیز حل شد :)

راهه حل :





if($category)
{
$query->whereIn('id', DB::table('post_category')->where('category_id', $category)->lists('post_id'));
}


تحلیل کد :
خط اول که چک کردیم اگر متغییر category مقدار داشت ( مقداری که از اینپوت و یا get اومده ) ، شرط رو اجرا کن .
خط دوم : من در کد های قبل ( پست های قبلی ) ، جدول potst رو سلکت کردم و شرط های دیگه رو نوشتم و حالا در این خط ، آی دی دسته رو رو درون جدول واسط سرچ کردم و آی دی پست هایی که درون دسته مورد نظرم بود رو واکشی کردم !

و تمام ;)

واقعا از آقا رضای عزیز ممنون که انصافا به من لطف داشتن :)