В функции обновления во время проверки с пользовательскими правилами игнорировать текущий идентификатор для дубликатов в laravel - PullRequest
0 голосов
/ 09 ноября 2019

Я использую Laravel 6. Я создал форму для обновления собрания, а также некоторые правила проверки в контроллере, которые проверяют, свободна ли комната в это время и если участники уже заняты в другой встрече в это время. К сожалению, когда я отправляю форму и меняю, например, только описание собрания, процесс проверки не работает должным образом, потому что он говорит, что текущая комната уже занята, а также участники уже заняты в другой встрече вв это время ... это происходит потому, что процесс проверки не исключает проверки текущего идентификатора собрания. Таким образом, собрание является дубликатом самого себя.

Я пытался многими способами изменить метод проверки, исключая $ id, переданный в качестве второго аргумента функции update_meeting, но они не работали.

Контроллер:

public function update_meeting(Request $request, $id)
{

    $this->validate($request, [
        'participants' => [ 'required', new CheckParticipant() ], 
        'description' => 'required',
        'room' => [ 'required', new CheckRoom() ],
        'date_meeting' => [ 'required', new CheckDateTime() ],
        'start' => [ 'required', new CheckTime() ],
        'end' => 'required',
    ]);

    $meeting = Meeting::find($id);

    $participants = request('participants');
    $meeting->id_participants = implode(';', $participants);

    $meeting->description = request('description');
    $meeting->id_room = request('room');
    $meeting->date = request('date_meeting');
    $meeting->start_hour = request('start');
    $meeting->end_hour = request('end');

    $meeting->save();

    $message_correct = "The meeting has been correctly updated!";

    return redirect()->route('home')->with('success', $message_correct);

}

Пользовательское правило (CheckRoom):

public function passes($attribute, $value)
{

    $meetings = DB::table('meetings')
    ->where('id_room', request('room'))
    ->where('date', request('date_meeting'))
    ->where(function ($query) {
        $query->where(function($sub_q) {
                $sub_q->where('start_hour', '>=', request('start'))
                        ->where('start_hour', '<', request('end'));
            })
            ->orWhere(function($sub_q) {
                $sub_q->where('start_hour', '<', request('start'))
                        ->where('end_hour', '>=', request('end'));
            })
            ->orWhere(function($sub_q) {
                $sub_q->where('end_hour', '>', request('start'))
                        ->where('end_hour', '<=', request('end'));
            });
    })->get();

    if(count($meetings) > 0) {
        return false;
    } else {
        return true;
    }
}

Есть ли способ игнорировать текущий идентификатор в методе validateили я должен изменить правило, исключая идентификатор в запросе?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Вы пытались передать значение в конструкторе? new CheckRoom($id)

class CheckRoom implements Rule
{
    protected $excludeId = null;

    public function __construct($id = null)
    {
        $this->excludeId = $id;
    }

    public function passes($attribute, $value)
    {
        return DB::table('meetings')
            ...
            ->when($this->excludeId, function ($query, $exclude) {
                $query->where('id', '<>', $exclude);
            })->doesntExist();
    }

    ...
}
0 голосов
/ 09 ноября 2019

Вы можете использовать его таким образом здесь, в моем случае, мое поле - это имя пользователя и имя таблицы, идентификатор администратора, а идентификатор игнорируемого - $ id

   'username'=>'required|unique:admins,username,'.$id
...