سلام
ما وقتی می خواهیم چک کنیم که مقداری که کاربر در فرم وارد کرده در دیتابیس ما موجود باشه می تونیم در بخش Validation از exists استفاده کنیم.
مثلا اگر بخوام چک کنم که نام مجموعه ای که کاربر وارد کرده می بایست از قبل در دیتابیس موجود باشه می تونم این دستور رو بزنم:
public function rules()
{
return [
'id'=>['required','exists:categories,id']
];
}
حالا اگر بخوام زمانی خطا فعال بشه که در دیتابیس وجود داره. یعنی دقیقا نقیض مورد بالا. در حقیقت می خوام not exist رو اعتبار سنجی کنم. اما همچین عبارتی نداریم. ! نیز نقیض نمی کنه. برای این کار تو همین بخش چه کاری می شه انجام داد؟ (البته می تونم تو خود کنترلر کوئری بزنم و از موجود نبودنش مطمئن بشم. اما حدس می زنم راهی باشه که تو همین بخش بشه حلش کرد.)
من اینرو برای بخش ویرایش نام مجموعه می خوام. در حقیقت می خوام وقتی کاربری نام مجموعه رو تغییر می ده مطمئن بشم که نام جدیدی که وارد می کنه قبلا استفاده نشده باشه. شاید راه های دیگری هم باشه که ممنون می شم اون ها رو هم پیشنهاد بدید. اما سوال اصلیم همینیه که تو بالا توضیح دادم و می خوام اگر تو validate امکان حل کردنش باشه تو همون بخش حلش کنم.
با تشکر
میتونید از unique استفاده کنید
public function rules()
{
return [
'id'=>['required','unique:categories']
];
}
ممنون از بابت راهنماییتون.
ولی unique تو این مورد کارساز نیست. من وقتی یک فرم رو آپدیت می کنم ممکنه فیلدهای دیگر تغییر کنند اما فیلدی که باید یونیک باشه نیاز به تغییر نداشته باشه. در اونصورت ولیدیشن اجازه آپدیت رو نخواهد داشت. چون چک می کنه و می بینه که مقدار فیلد یونیک قبلا هستش.
یعنی مثلا اگر بخواهم مشخصات یک category رو تغییر بدم. مثلا slug ش رو عوض کنم اما نامش رو عوض نکنم وقتی ولیدیت می کنه و می بینه نام قبلا هست (در حقیقت همون نام خود همین مجموعه ای که داره ویرایش می شه) خطا می ده و اجازه نمی ده تغییرات ذخیره بشه
مشکلی نیست، unique برای این موضوع متغییر سوم میگیره
مثل کد زیر
public function rules()
{
return [
'email' => 'required|email|unique:users,email,'.$this->user->id,
];
}
یک راهش استفاده از پارامتر سوم هست که دوستمون اشاره کرد
یک راه دیگه هم استفاده از کلاس Rule هست:
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
همچنین به جای id میتونی خود مدل رو هم پاس بدی
Rule::unique('users')->ignore($user)
@mehranmarandi90 حق با شماست. منتها من به صورت زیر
public function rules()
{
return [
'title'=>['required','unique:categories,title,'.$this->category->id]
];
}
و حتی به صورت زیر کدها رو نوشتم ولی هیچ واکنشی نشون نداد. اشتباهم کجاست؟ من می خوام روی مقدار title (که کلید اصلی نیست) اعمال بشه.
public function rules()
{
return [
'title'=>['required','unique:categories,title,'.$this->category->title]
];
}
اين كد رو امتحان كنيد
public function rules()
{
return [
'title'=>['required',Rule::unique('categories')->ignore($this->category->id)]
];
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟