Armin Rahmati
4 سال پیش توسط Armin Rahmati مطرح شد
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'));
    }

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


ثبت پرسش جدید
Armin Rahmati
@arminrahmati999 4 سال پیش آپدیت شد
0

@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


فرشید مرادی
تخصص : noob
@eniack 4 سال پیش مطرح شد
0

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


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

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


فرشید مرادی
تخصص : noob
@eniack 4 سال پیش آپدیت شد
0

@arminrahmati999

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

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


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

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


فرشید مرادی
تخصص : noob
@eniack 4 سال پیش آپدیت شد
0

@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
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
0

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


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

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

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

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

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

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

در این حالت:

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

Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

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


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@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
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
0

می تونید از کد زیر استفاده کنید
@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
@arminrahmati999 4 سال پیش مطرح شد
0

@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
@arminrahmati999 4 سال پیش مطرح شد
0

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


moha li
تخصص : توسعه دهنده لاراول و Vue
@mohaligateway 4 سال پیش مطرح شد
0

جدول Roles دارید ؟


Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
Armin Rahmati
@arminrahmati999 4 سال پیش مطرح شد
0

@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 4 سال پیش مطرح شد
0

با توجه به این که اطلاعات دکتر توی هر ۲ جدول هست میتونی 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
@arminrahmati999 4 سال پیش مطرح شد
0

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


فرشید مرادی
تخصص : noob
@eniack 4 سال پیش آپدیت شد
0

@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
@arminrahmati999 4 سال پیش مطرح شد
0

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

orwhere('is_superuser', 1)

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


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

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