راکت

چگونه موجود نبودن یک مقدار در جدول را از طریق validate چک کنیم

سلام
ما وقتی می خواهیم چک کنیم که مقداری که کاربر در فرم وارد کرده در دیتابیس ما موجود باشه می تونیم در بخش Validation از exists استفاده کنیم.
مثلا اگر بخوام چک کنم که نام مجموعه ای که کاربر وارد کرده می بایست از قبل در دیتابیس موجود باشه می تونم این دستور رو بزنم:

public function rules()
    {
        return [
            'id'=>['required','exists:categories,id']
        ];
    }

حالا اگر بخوام زمانی خطا فعال بشه که در دیتابیس وجود داره. یعنی دقیقا نقیض مورد بالا. در حقیقت می خوام not exist رو اعتبار سنجی کنم. اما همچین عبارتی نداریم. ! نیز نقیض نمی کنه. برای این کار تو همین بخش چه کاری می شه انجام داد؟ (البته می تونم تو خود کنترلر کوئری بزنم و از موجود نبودنش مطمئن بشم. اما حدس می زنم راهی باشه که تو همین بخش بشه حلش کرد.)

من اینرو برای بخش ویرایش نام مجموعه می خوام. در حقیقت می خوام وقتی کاربری نام مجموعه رو تغییر می ده مطمئن بشم که نام جدیدی که وارد می کنه قبلا استفاده نشده باشه. شاید راه های دیگری هم باشه که ممنون می شم اون ها رو هم پیشنهاد بدید. اما سوال اصلیم همینیه که تو بالا توضیح دادم و می خوام اگر تو validate امکان حل کردنش باشه تو همون بخش حلش کنم.
با تشکر


ثبت پرسش جدید
مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi5 سال پیشمطرح شد
-1

میتونید از unique استفاده کنید

public function rules()
    {
        return [
            'id'=>['required','unique:categories']
        ];
    }

رافق مجتهدزاده
رافق مجتهدزاده
تخصص :برنامه نویسی php
@rafig5 سال پیشمطرح شد
0

ممنون از بابت راهنماییتون.
ولی unique تو این مورد کارساز نیست. من وقتی یک فرم رو آپدیت می کنم ممکنه فیلدهای دیگر تغییر کنند اما فیلدی که باید یونیک باشه نیاز به تغییر نداشته باشه. در اونصورت ولیدیشن اجازه آپدیت رو نخواهد داشت. چون چک می کنه و می بینه که مقدار فیلد یونیک قبلا هستش.
یعنی مثلا اگر بخواهم مشخصات یک category رو تغییر بدم. مثلا slug ش رو عوض کنم اما نامش رو عوض نکنم وقتی ولیدیت می کنه و می بینه نام قبلا هست (در حقیقت همون نام خود همین مجموعه ای که داره ویرایش می شه) خطا می ده و اجازه نمی ده تغییرات ذخیره بشه


مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi5 سال پیشمطرح شد
0

مشکلی نیست، unique برای این موضوع متغییر سوم میگیره
مثل کد زیر

public function rules()
{
  return [
      'email' => 'required|email|unique:users,email,'.$this->user->id,
  ];
}

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

یک راهش استفاده از پارامتر سوم هست که دوستمون اشاره کرد
یک راه دیگه هم استفاده از کلاس 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)

رافق مجتهدزاده
رافق مجتهدزاده
تخصص :برنامه نویسی php
@rafig5 سال پیشمطرح شد
0

@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]
        ];
    }

مهران مرندی
مهران مرندی
تخصص :برنامه نویس
@mehranmarandi5 سال پیشمطرح شد
0

اين كد رو امتحان كنيد

public function rules()
    {
        return [
            'title'=>['required',Rule::unique('categories')->ignore($this->category->id)]
        ];
    }

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

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