Armin Rahmati
3 سال پیش توسط Armin Rahmati مطرح شد
1 پاسخ

جستجو برای دو فیلد

سلام دوستان.
من دو تا جدول دارم، یکی users و دیگری profiles.

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('role')->default('user');
    $table->string('email')->unique();
    $table->string('password');
    $table->timestamps();
 });
Schema::create('profiles', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained()->onDelete('CASCADE');
    $table->string('firstName');
    $table->string('lastName');
    $table->string('phone');
    $table->timestamps();
});

حالا میخوام وقتی نام و نام خانوادگی کاربر رو جستجو میکنم نتیجه درست رو نمایش بده ولی چیزی نمایش نمیده، در صورتی که اگه نام یا نام خانوادگی رو جدا وارد کنه نتیجه درست رو نمایش میده.
کنترلر مربوطه به صورت زیر است:

public function users() {
    $users = User::query();
    if ($keyword = request('search')) {
        $users->where('email', 'LIKE', "%{$keyword}%")->orWhereHas('profile', function ($query) use ($keyword) {
            $query->where('firstName', 'LIKE', "%{$keyword}%")->orWhere('lastName', 'LIKE', "%{$keyword}%")->orWhere('phone', 'LIKE', "%{$keyword}%");
        });
    }
    $users = $users->latest()->paginate(10);
    return view('panel.users.index', compact('users'));
}

همچنین به صورت زیر هم نوشتم ولی مجدد هیچی نمایش نمیده.

$query->where('firstName', 'LIKE', "%{$keyword}%")->where('lastName', 'LIKE', "%{$keyword}%")->orWhere('phone', 'LIKE', "%{$keyword}%");

ثبت پرسش جدید
رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 3 سال پیش مطرح شد
0

سلام به شما دوست عزیز.
نکته ای که باید به آن توجه کنید این است که دو فیلد firstName و lastName باید به عنوان یک فیلد شناخته بشن تا بتونید با سرچ اسم و فامیل نتیجه درست رو برگردونید. برای انجام اینکار میتونید از عمل concat کردن استفاده کنید که کد شما به صورت زیر باید نوشته بشه.

public function users() {
    $users = User::query();
    if ($keyword = request('search')) {
        $users->where('email', 'LIKE', "%{$keyword}%")->orWhereHas('profile', function ($query) use ($keyword) {
            $query->where(DB::raw('concat(firstName," ",lastName)') , 'LIKE' , "%{$keyword}%")->orWhere('phone', 'LIKE', "%{$keyword}%");
        });
    }
    $users = $users->latest()->paginate(10);
    return view('panel.users.index', compact('users'));
}

در واقع کوئری شما باید به صورت زیر نوشته بشه.

$query->where(DB::raw('concat(firstName," ",lastName)') , 'LIKE' , "%{$keyword}%")->orWhere('phone', 'LIKE', "%{$keyword}%");

موفق باشید.


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

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