راکت
حل شده

کوئری برای جستجو در دو جدول مختلف

5 پاسخ

سلام دوستان :

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

این دو تا جدول رو اینجوری نوشتم :

 $q = trim($request->search);
        $user = DB::table('dedicateds')
            ->Where('keywords', 'LIKE', '%' . $q . '%')
            ->orWhere('company_name', 'LIKE', '%' . $q . '%')
            ->orWhere('ostan', 'LIKE', '%' . $q . '%')
            ->paginate(15);

        $normal = DB::table('normalkars')
            ->Where('keywords', 'LIKE', '%' . $q . '%')
            ->orWhere('name', 'LIKE', '%' . $q . '%')
            ->orWhere('ostan', 'LIKE', '%' . $q . '%')
            ->paginate(15);

چطوری میتونم این موضوع رو پیاده سازی کنم ؟

ثبت پرسش جدید

پاسخ‌ها

5
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

بهترین پاسخ

نه شرط نمیخواد در هرصورت شما بدون شرط نتایج هر چی باشه رو به ویوی سرچت بفرست اونجا متغیرهارو تست کن اگه مقدار داشتن نشونشون بده و اگه خالی بودن پیامی به کاربر مبنی بر اینکه رکوردی یافت نشد نمایش بده.
اونجا باید دقت کنی در ویوی سرچت بهتره یه پیام در صورت پیدا نشدن رکوردی در هر دو جدول نشون بدی.

@if ($user->count() == 0 && $normal->count() == 0)
    داده ای یافت نشد
@else
    @foreach($user as $u)
        show all users
    @endforeach
    @foreach($normal as $n)
        show all normal
    @endforeach
@endif
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

اینطور شرط ها رو باید اینطوری بنویسی

        $q = trim($request->search);
        $user = DB::table('dedicateds')
           ->Where('keywords', 'LIKE', '%' . $q . '%')
           ->orWhere(function($query)use($q) {
               $query->where('company_name', 'LIKE', '%' . $q . '%')
                ->orWhere('ostan', 'LIKE', '%' . $q . '%');
           })->paginate(15);

راهنما

Mohammad Abdollahi
Mohammad Abdollahi
@dr.m.abdollahi

درود
خب در این کدی که نوشتید جدول normalkars وجود نداره !

@hosseinshirinegad98

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

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

ببین منظور شما اگه این باشه که نتایج جستجو دو جدولو درقالب یه متغییر داشته باشی ایتدا برای هر جدول تنها کوئری بکش بعد دو تا متغییرتو با هم union کن اینطوری دو متغییر تبدیل به یه متغییر میشه البته در این جا نکته ای هست و این که تمام ستون های دو جدول باید مثل هم باشه. دنبال متد uninon در کالکشن های لاراول باش و یادش بگیر. سادست
یا میتونی به همین روش خودت عمل کنی بعد هنگام نمایش از دو تا foreach پشت سرم هم برای نمایش هر کدوم استفاده کنی.
روش استفاده از union تو این لینک هست

Mohammad Abdollahi
Mohammad Abdollahi
@dr.m.abdollahi

درود
بله به نظرم روشی ک خودم استفاده کردم بهتر هست فقط یک سوال اینجا پیش میاد :

 $q = trim($request->search);
        $user = DB::table('dedicateds')
            ->Where('keywords', 'LIKE', '%' . $q . '%')
            ->orWhere('company_name', 'LIKE', '%' . $q . '%')
            ->orWhere('ostan', 'LIKE', '%' . $q . '%')
            ->paginate(15);

        $normal = DB::table('normalkars')
            ->Where('keywords', 'LIKE', '%' . $q . '%')
            ->orWhere('name', 'LIKE', '%' . $q . '%')
            ->orWhere('ostan', 'LIKE', '%' . $q . '%')
            ->paginate(15);

 if (count($user) > 0)
            return view('user.searched', compact('user','normal', 'q'));
        else  return abort(404);

چطوری با یه شرط کاربر رو به view جستجو بفرستم ؟
مثلا وقتی که متغییر user نتیجه ای در برنداشته باشد نباید ارسال بشه
وقتی هم متغییر normal نتیجه ای در برنداشته باشد نباید ارسال بشه

ببینید می تونیم یکاری کنیم 3 تا view برای جستجو داشته باشیم
ویو اول : اگر count(user) بزرگتر از 0 باشه و count(normal) مساوی صفر باشه
ویو دوم : اگر هم user و هم normal بزرگتر از 0 باشن
ویو سوم : اگر count(user) مساوی صفر باشه و Count(normal) بزرگتر از صفر باشه

نظر شما چیست ؟
@hosseinshirinegad98

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

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