راکت
حل شده

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

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}%");
ثبت پرسش جدید

پاسخ‌ها

1
رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

بهترین پاسخ

سلام به شما دوست عزیز.
نکته ای که باید به آن توجه کنید این است که دو فیلد 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}%");

موفق باشید.

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

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

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