سلام خدمت دوستان.
من داخل سایتم سه نوع کاربر دارم: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'));
}
حالا اگه بخوام این جستجو فقط بین دکترها انجام بشه باید به چه صورت بنویسم؟
@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
@arminrahmati999
سلام ، دکترها باید یک فیلد منحصر به فرد داشته باشن یا کلا جدول users شما مثلا یک فیلد مثل job داشته باشه که مشخص کنه هر فرد چه نقشی داخل سایت داره به این صورت خیلی ساده میتونید سرچ کنید
$users = User::where('role', 1)
->where('lastName', 'LIKE', "%{$request->search}%")->paginate();
اینو تست کنید ، فرض بر اینکه کسایی که role 1 دارن دکتر ها هستن
@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();
سلام
از اونجائی که شما درخواست های request دارید می تونید با استفاده از یک فیلتر مثلا dropdown ابتدا دسته بندی کاربر مورد نظر رو در ورودی بگیرید. سپس با استفاده از کد زیر همانطور که دوستمون @arminrahmati999 گفتن تنها همون دسته بندی رو انجام بدید.
ولی بهتره از role ها استفاده کنی. احتمالا شما یک many to many relationship دارید بین کاربر ها و نقش ها درخواست رو بگیرید و توی role ها جست و جو کنید و تنها اون کاربر هایی که role دکتر را دارند برگردونید.
@arminrahmati999
ببینید ۲ راه کلی هست که هر کدوم مزایایی داره
در این حالت شما کل فیلد ها رو در جدول یوزر میگذاری و از نوع nullable استفاده میکنی
مثلا ممکنه یه فیلد is_doctor داشته باشی که برای دکترها مقدارش true هست
که میتونه خیلی روش تمیزی نباشه و جدول بزرگی داشته باشی که اکثر row ها کلی فیلد null داشته باشند
این روش برای پروژه های بزرگتر مناسب تره
جداول doctors و doctor_user رو در کنار users نظر بگیرید..
دکتر در این سیستم یه یوزر هست اما احتمالا شما مشخصاتی رو برای یه دکتر در سیستمت ثبت خواهی کرد که کاربر عادی اون ها رو نداره.. مثلا شماره پروانه پزشکی و غیره
پس این مشخصات یونیک رو در جدول doctors میگذاری و در پیوت doctor_user یوزر ها و دکتر ها رو ارتباط میدی
در این حالت:
@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();
});
الان با توجه به این دو جدول چطور باید این کارو انجام بدم؟
می تونید از کد زیر استفاده کنید
@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'));
}
@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
@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();
با توجه به این که اطلاعات دکتر توی هر ۲ جدول هست میتونی join بزنی
User::join('doctors', 'doctors.user_id', '=', 'users.id')
->where('users.firstName', 'LIKE', "%{$request->search}%")
->orWhere('users.lastName', 'LIKE', "%{$request->search}%")
->paginate(10);
@ali.bayat
بازم نال برمیگردونه.
البته من اینم یادم رفت بگم که من این سرچو داخل پنل ادمین دارم انجام میدم، در واقع این سرچ داره توسط ادمین انجام میشه.
@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();
و یا یکی از مقادیر برابر بود نتیجه برگرده از کد اولی باید استفاده کنید
@eniack
من در واقع میخوام اگر یکی از مقادیر بود نتیجه برگرده.
کد اول لطف کنید بفرمایید، کد زیر چیه دقیقا؟
orwhere('is_superuser', 1)
کد دوم هم تست کردم ولی جواب نداد.
البته من اینم یادم رفت بگم که من این سرچو داخل پنل ادمین دارم انجام میدم، در واقع این سرچ داره توسط ادمین انجام میشه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟