Laravel - Проверка правил запроса на обновление не работает - PullRequest
0 голосов
/ 05 апреля 2020

В моем проекте Laravel5.8 у меня есть код проверки уникальных правил для создания:

MYSQL

ALTER TABLE `hr_holiday_dates`
  ADD UNIQUE KEY `holidaydates_unique_key` ('group_id','holiday_name','date_from');

Модель

class HrHolidayDate extends Model
{
  protected $table = 'hr_holiday_dates';
  protected $primaryKey = 'id';

  protected $fillable = [
              'holiday_name',
              'group_id',
              'date_from',
              'date_to',
              'description',
          ];

  public function holidaygroup()
  {
    return $this->belongsTo('App\Models\Hr\HrHolidayGroup','group_id');
  }

}

Контроллер

public function edit($id)
{
    $userCompany = Auth::user()->company_id;

    abort_unless(\Gate::allows('holiday_date_edit'), 403);
    $holiday = HrHolidayDate::where('id', $id)->first();   
    $holidaygroups = HrHolidayGroup::where('company_id', $userCompany)->get();
    return view('hr.holiday_dates.edit')->with('holiday', $holiday)->with('holidaygroups', $holidaygroups);
}

public function update(UpdateHolidayDateRequest $request, $id)
{
    $dateFrom = Carbon::parse($request->date_from);
    $dateTo = Carbon::parse($request->date_to);

    $holiday = HrHolidayDate::find($id);                            
    $holiday->holiday_name = $request->holiday_name;
    $holiday->group_id = $request->group_id;
    $holiday->date_from = $dateFrom;
    $holiday->date_to = $dateTo;
    $holiday->description = $request->description;
    $holiday->save();
    Session::flash('success', 'Holiday is updated successfully');
    return redirect()->route('hr.holiday_dates.index');
}

Правила

    'holiday_name' => [
        'required', 
        'min:3',
        'max:80',
            Rule::unique('holiday_dates')->where(function ($query) {
            return $query->where('group_id', $this->group_id)
                    ->where('holiday_name', $this->holiday_name)
                    ->where('date_from', Carbon\Carbon::parse($this->date_from)->format('Y-m-d'));
            })               
    ],  

, который работает.

holiday_name является основным полем, и оно уникально в отношении group_id и date_from. holiday_dates - это имя таблицы, а holiday_date - маршрут.

Как я пытался сделать это для проверки уникальных правил для обновления, но это не работает:

    'holiday_name' => 
    [
        'required', 
        'min:3',
        'max:80',
        Rule::unique('holiday_dates')->where(function ($query) {
        return $query
            ->where('group_id', 1)
            ->where('holiday_name', 1)
            ->where('date_from', Carbon\Carbon::parse($this->date_from)->format('Y-m-d'));
    })->ignore($this->holiday_date) 
    ],                            

Как сделать Я разрешаю это.

Спасибо

1 Ответ

0 голосов
/ 05 апреля 2020

Хорошо. У вас есть идентификатор в качестве первичного ключа. Поэтому, когда вы собираетесь обновить ресурс, у вас есть экземпляр модели следующим образом.

$hrHolidayDate = HrHolidayDate::find($id); // or any other way to get the model instance.

и обновите правила следующим образом.

Правила

'holiday_name' => 
    [
        'required', 
        'min:3',
        'max:80',
        Rule::unique('holiday_dates')->where(function ($query) {
        return $query
            ->where('group_id', 1)
            ->where('holiday_name', 1)
            ->where('date_from', Carbon\Carbon::parse($this->date_from)->format('Y-m-d'));
    })->ignore($hrHolidayDate->id)
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...