راکت
حل شده

جستجو بین کاربران

25 پاسخ

سلام خدمت دوستان.
من داخل سایتم سه نوع کاربر دارم:user، admin و doctor.
وقتی میخوام بین همه کاربرها جستجو انجام بدم از کد زیر استفاده میکنم:

public function show(Request $request) {
        $users = User::where('firstName', 'LIKE', "%{$request->search}%")
            ->orwhere('lastName', 'LIKE', "%{$request->search}%")->paginate();
        return view('Panel.users.index', compact('users'));
    }

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

ثبت پرسش جدید

پاسخ‌ها

25
Armin Rahmati
Armin Rahmati
@arminrahmati999
بهترین پاسخ

@eniack
من خودم به این صورت نوشتم و جواب گرفتم.

$users = User::where('firstName', 'LIKE', "%{$request->search}%")
            ->orwhere('lastName', 'LIKE', "%{$request->search}%")
            ->where('role', 'doctor')->paginate();

کد شما هم درست بود.

$users = User::where('role', 1)
        ->where('name', 'LIKE', "%{$request->search}%")->orwhere('role', 1)->where('lastName', 'LIKE', "%{$request->search}%")->get();

تشکر بابت وقتی که گذاشتین.
@eniack
@mohaligateway
@ali.bayat

فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

@arminrahmati999
سلام ، دکترها باید یک فیلد منحصر به فرد داشته باشن یا کلا جدول users شما مثلا یک فیلد مثل job داشته باشه که مشخص کنه هر فرد چه نقشی داخل سایت داره به این صورت خیلی ساده میتونید سرچ کنید

Armin Rahmati
Armin Rahmati
@arminrahmati999

@eniack
داخل جدول users یه فیلد به اسم role دارم

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

فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

@arminrahmati999

  $users = User::where('role', 1)
            ->where('lastName', 'LIKE', "%{$request->search}%")->paginate();

اینو تست کنید ، فرض بر اینکه کسایی که role 1 دارن دکتر ها هستن

Armin Rahmati
Armin Rahmati
@arminrahmati999

@eniack
الان درست نمایش میده ولی من میخوام هم بر اساس نام باشه و هم نام خانوادگی.

فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

@arminrahmati999
اینو تست کنید

$users = User::where('role', 1)
            ->where('lastName', 'LIKE', "%{$request->search}%")->where('Name', 'LIKE', "%{$request->search}%")->paginate();

یا

 $users = User::where('role', 1)
            ->where('lastName', 'LIKE', "%{$request->search}%")->orWhereHas('Name', 'LIKE', "%{$request->search}%")->paginate();
moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

سلام
از اونجائی که شما درخواست های request دارید می تونید با استفاده از یک فیلتر مثلا dropdown ابتدا دسته بندی کاربر مورد نظر رو در ورودی بگیرید. سپس با استفاده از کد زیر همانطور که دوستمون @arminrahmati999 گفتن تنها همون دسته بندی رو انجام بدید.
ولی بهتره از role ها استفاده کنی. احتمالا شما یک many to many relationship دارید بین کاربر ها و نقش ها درخواست رو بگیرید و توی role ها جست و جو کنید و تنها اون کاربر هایی که role دکتر را دارند برگردونید.
@arminrahmati999

Armin Rahmati
Armin Rahmati
@arminrahmati999

@eniack
هیچی نمایش نمیده.
اینا رو قبلا تست کرده بودم و چون به جوابی نرسیدم پرسیدم.

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

ببینید ۲ راه کلی هست که هر کدوم مزایایی داره

  • قرار دادن تمام فیلد ها در جدول users

در این حالت شما کل فیلد ها رو در جدول یوزر میگذاری و از نوع nullable استفاده میکنی
مثلا ممکنه یه فیلد is_doctor داشته باشی که برای دکترها مقدارش true هست
که میتونه خیلی روش تمیزی نباشه و جدول بزرگی داشته باشی که اکثر row ها کلی فیلد null داشته باشند

  • ساخت جداول جداگانه

این روش برای پروژه های بزرگتر مناسب تره
جداول doctors و doctor_user رو در کنار users نظر بگیرید..
دکتر در این سیستم یه یوزر هست اما احتمالا شما مشخصاتی رو برای یه دکتر در سیستمت ثبت خواهی کرد که کاربر عادی اون ها رو نداره.. مثلا شماره پروانه پزشکی و غیره
پس این مشخصات یونیک رو در جدول doctors میگذاری و در پیوت doctor_user یوزر ها و دکتر ها رو ارتباط میدی

در این حالت:

  • کاربرا ها رو کاملا از هم ایزوله میکنی
  • جدول ها کوچیک تر میشند
  • برای سرچ ها به راحتی از JOIN استفاده میکنی
Armin Rahmati
Armin Rahmati
@arminrahmati999

@mohaligateway
من یک رابطه one to many دارم و هر کاربر فقط میتونه یه نقش داشته باشه.

Armin Rahmati
Armin Rahmati
@arminrahmati999

@ali.bayat
بله منم همین کارو کردم ولی دو جدول درنظر گرفتم

Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('firstName');
            $table->string('lastName');
            $table->string('mobile')->unique();
            $table->string('idNumber')->unique();
            $table->string('role')->default('user');
            $table->string('password');
            $table->timestamps();
        });
Schema::create('doctors', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->onDelete('CASCADE')->onUpdate('CASCADE');
            $table->string('specialty');
            $table->string('degree');
            $table->string('image');
            $table->timestamps();
        });

الان با توجه به این دو جدول چطور باید این کارو انجام بدم؟

moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

می تونید از کد زیر استفاده کنید
@arminrahmati999

public function show(Request $request) {
        $users = Role::where($request->role_id)->user()
        ->where('firstName', 'LIKE', "%{$request->search}%")
                ->orwhere('lastName', 'LIKE', "%{$request->search}%")->paginate();
        return view('Panel.users.index', compact('users'));
}
Armin Rahmati
Armin Rahmati
@arminrahmati999

@eniack
واسه کد زیر هیچی نمایش نمیده:

$users = User::where('role', 1)
            ->where('lastName', 'LIKE', "%{$request->search}%")->where('Name', 'LIKE', "%{$request->search}%")->paginate();

و کد زیر رو وقتی میزنم:

$users = User::where('role', 1)
            ->where('lastName', 'LIKE', "%{$request->search}%")->orWhereHas('Name', 'LIKE', "%{$request->search}%")->paginate();

ارور زیر رو میده:

Argument 2 passed to Illuminate\Database\Eloquent\Builder::orWhereHas() must be an instance of Closure or null, string given
Armin Rahmati
Armin Rahmati
@arminrahmati999

@mohaligateway
من مدل Role رو ندارم.

moha li
moha li
@mohaligateway

تخصص: توسعه دهنده لاراول و Vue

جدول Roles دارید ؟

Armin Rahmati
Armin Rahmati
@arminrahmati999
Armin Rahmati
Armin Rahmati
@arminrahmati999

@ali.bayat
اینو نوشتم ولی بازم جوابی نگرفتم و خروجی نال هست.

$users = User::select('users.id', 'role', 'firstName', 'lastName', 'mobile', 'idNumber')
            ->where('role', '=', 'doctor')
            ->join('doctors', 'doctors.id' , '=', 'role')
            ->where('firstName', 'LIKE', "%{$request->search}%")
            ->orwhere('lastName', 'LIKE', "%{$request->search}%")->paginate();
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

با توجه به این که اطلاعات دکتر توی هر ۲ جدول هست میتونی join بزنی

User::join('doctors', 'doctors.user_id', '=', 'users.id')
    ->where('users.firstName', 'LIKE', "%{$request->search}%")
    ->orWhere('users.lastName', 'LIKE', "%{$request->search}%")
    ->paginate(10);
Armin Rahmati
Armin Rahmati
@arminrahmati999

@ali.bayat
بازم نال برمیگردونه.
البته من اینم یادم رفت بگم که من این سرچو داخل پنل ادمین دارم انجام میدم، در واقع این سرچ داره توسط ادمین انجام میشه.

فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

@arminrahmati999
لطفا این کد رو تست کنید ببینید مشکلتون حل میشه ،

 return $users = User::where('role', 1)
        ->where('name', 'LIKE', "%{$request->search}%")->orwhere('is_superuser', 1)->where('lastName', 'LIKE', "%{$request->search}%")->get();

ببینید اگر شما قصدتون اینه که نام و هم نام خانوادگی جفتش برابر باشه و به اصطلاح AND بشه از این دستور باید استفاده کنید

$users = User::where('role', 1)
            ->where('lastName', 'LIKE', "%{$request->search}%")->where('Name', 'LIKE', "%{$request->search}%")->paginate();

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

Armin Rahmati
Armin Rahmati
@arminrahmati999

@eniack
من در واقع میخوام اگر یکی از مقادیر بود نتیجه برگرده.
کد اول لطف کنید بفرمایید، کد زیر چیه دقیقا؟

orwhere('is_superuser', 1)

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

صفحه 1 از 2

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

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