رافق مجتهدزاده
3 سال پیش توسط رافق مجتهدزاده مطرح شد
6 پاسخ

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

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

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

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

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


ثبت پرسش جدید
مهران مرندی
تخصص : برنامه نویس
@mehranmarandi 3 سال پیش آپدیت شد
-1

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

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

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

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


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

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

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

علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
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
@rafig 3 سال پیش مطرح شد
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]
        ];
    }

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

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

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

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

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