سلام دوستان.
من سه تا جدول دارم: users, deliveries, roles
زمانی که میخوام راننده جدید ایجاد کنم، داخل Request اومدم به صورت زیر تعریف کردم:
public function rules()
{
return [
'user_id' => ['required', 'exists:users,id', 'unique:deliveries,user_id'],
];
}
حالا میخوام یه محدودیت دیگه بذارم که راننده حتما نقشش delivery باشه.
ممنون میشم راهنمایی کنید.
خب
$this->user()
فقط کاربری رو برمی گردونه که توی همون درخواست(کلاینت) همون زمان که درخواست و می فرسته لاگین شده و ربطی به userid داخل پارامترای ورودی نداره
پس از این کد استفاده کن
'user_id' => [
'required',
'exists:users,id',
'unique:deliveries,user_id',
function($attribute, $value, $fail){
if( User::find($value)->roles->pluck('name')->doesntContain('delivery') )
$fail('The user has not the `delivery` role !'); //The error message
}
]
البته بالای کد ها هم بزن مدلو وارد کن:
use App\Models\User;
بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ
الْحَمْدُ لِلّٰه
https://laravel.com/docs/9.x/validation#custom-validation-rules
سلام، تو میتونی از closure ها استفاده کنی و خودت بری واجد شرایط نبودن رو با $fail مشخص کنی و غیره... مثل مسیج ها رو واسه خطاها خودت مدیریت کنی!
نگاهی کن :
public function rules()
{
return [
'user_id' => ['required', 'exists:users,id', 'unique:deliveries,user_id',function($attribute, $value, $fail){
//handle the $fail your self
//if the $fail callback does not invoke, it will mean that validated! other wise means to unvalidated
if($failed)
$fail('The error message!');
}],
];
}
@abol313
متوجه کدی که نوشتین نشدم ولی به صورت زیر نوشتم:
'user_id' => ['required', 'exists:users,id', 'unique:deliveries,user_id', Rule::exists('deliveries')->where(function ($query) {
return $query->where('user_id', $this->user()->roles->pluck('name') == 'delivery');
})],
ولی وقتی آیدی کاربری رو که نقش راننده داره وارد میکنم ارور میده که user_id صحیح نمی باشد.
بشه دقیقا خطا رو بفرستی و منظورت رو دقیق تر بگی ؟
منظور از منظورم تو چت قبلی اینه که بعضی قوانین وجود نداره که واسه اعتبار سنجی مناسب باشه و خب پس باید بعضی جاها از خودمون قوانین سفارشی بسازیم که اعتبار سنجی رو انجام بده
خب حالا مثلا داخل قانون سفارشی بیا کارتو که نمیشه با قوانین از قبل تعریف شده انجام داد، پس بیا خودت قانون سفارشی رو واسه کارت پیاده کن
خب حالا کارتم اینه که کاربر نقش delivery داشته باشه
در مورد مدل دیتابیس های درگیر هم توضیحی بده مثلا فیلد و اسمش و .. که مربوط میشه به این قانون سفارشی که باید بررسی بشه
@abol313
منظورم از ارور، ارور ولیدیشن هست.
من یه جدول users دارم، یه جدول deliveries دارم که داخل این جدول یه فیلد هست به نام:
$table->foreignId('user_id')->constrained('users')->cascadeOnUpdate()->cascadeOnDelete();
یه جدولم دارم به نام roles که یه فیلد داره به صورت زیر:
$table->string('name');
حالا میخوام زمانی که ادمین میخواد یه کاربر به عنوان راننده ثبت کنه اون کاربر نقش راننده داشته باشه و اگه نقشش راننده نبود اجازه ثبت نده.
@abol313
خدمت شما.
{
"message": "گزینه انتخاب شده user id صحیح نمی باشد",
"errors": {
"user_id": [
"گزینه انتخاب شده user id صحیح نمی باشد"
]
}
}
try it!
'user_id' => [
'required',
'exists:users,id',
'unique:deliveries,user_id',
function($attribute, $value, $fail){
if( $this->user()->roles->pluck('name')->doesntContain('delivery') )
$fail('The user has not the `delivery` role !'); //The error message
}
]
@abol313
الان هر user_id ای که بزنم ارور میده
{
"message": "The user has not the `delivery` role !",
"errors": {
"user_id": [
"The user has not the `delivery` role !"
]
}
}
@abol313
بله، چون جایی دیگه دارم از همین رابطه نقش کاربر رو برمیگردونم.
آخه این کدی که شما فرمودین، هر کاربری با هر نقشی رو آدیشو وارد کنم ارور میده.
مقدار name دقیقا باید چه باشه و میشه قبل از اجرای کد های closure یک dd() از pluck بگیری ؟
dd($this->user()->roles->pluck('name'));
@abol313
مقدار name، نام نقش هاس.
الان آیدی هر کاربری رو وارد میکنم خروجی dd میشه:
^ Illuminate\Support\Collection {#1374
#items: array:1 [
0 => "super-admin"
]
#escapeWhenCastingToString: false
}
@abol313
منظور اینه که چرا آیدی هر کاربر رو میزنم نقشش رو برنمیگردونه و واسه همه super-admin رو برمیگردونه
خب
$this->user()
فقط کاربری رو برمی گردونه که توی همون درخواست(کلاینت) همون زمان که درخواست و می فرسته لاگین شده و ربطی به userid داخل پارامترای ورودی نداره
پس از این کد استفاده کن
'user_id' => [
'required',
'exists:users,id',
'unique:deliveries,user_id',
function($attribute, $value, $fail){
if( User::find($value)->roles->pluck('name')->doesntContain('delivery') )
$fail('The user has not the `delivery` role !'); //The error message
}
]
البته بالای کد ها هم بزن مدلو وارد کن:
use App\Models\User;
@abol313
الان آیدی هر کاربری رو بزنم ثبت میکنه، در واقع کاربرایی هم که نقششون راننده نیست هم ثبت میکنه و ارور نمیده.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟