0

Columns of Table

  • id
  • idea_id
  • question_id

What I want to do

I want to validate the same idea_id and the same question_id.

For example.

id : 1 idea_id : 1 question_id : 1

id : 2 idea_id : 1 question_id : 2

id : 3 idea_id : 2 question_id : 1

id : 4 idea_id : 1 question_id : 1 ← validation error!! because idea_id = 1 and question_id = 1 record exists!

controller in larave-admin

/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
    $form = new Form(new IdeaQuestionAdoption());

    $form->select('idea_id', __('Idea id'))
            ->options(Idea::pluck('body', 'id'))
            ->rules('required');
    $form->select('question_id', __('Question id'))
            ->options(Question::pluck('title', 'id'))
            ->rules('required|unique:idea_question_adoptions,idea_id' . 
    $form->model()->id);

    return $form;
}

But. it doesn't work because $form->model()->id is Null.

How to validate multiple columns unique in laravel-admin?

  • I failed 'required|unique:idea_question_adoptions,idea_id' . $form->model()->id

  • I failed override update method.(This function was not working on update)

public function update($id)
{
    $data = IdeaQuestionAdoption::find($id);

    $validator = Validator::make($data, [
        'question_id' => 'required|unique:idea_question_adoptions,idea_id' . $data->id,
    ]);
    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator)->withInput();
    }
    return $this->form()->update($data->id);
}

How to validate multiple columns unique in laravel-admin?

please help me.

iamab.in
  • 2,022
  • 3
  • 18
  • 39
Naoki Oshiumi
  • 91
  • 1
  • 10
  • you can check my [answer](https://stackoverflow.com/questions/61305297/laravel-avoiding-double-booking-time-slots/61306108#61306108) regarding this issue. – Makdous Apr 22 '20 at 15:13
  • you are looking for a double-column validation. Check this one: https://stackoverflow.com/questions/50349775/laravel-unique-validation-on-multiple-columns – Christophe Hubert Apr 22 '20 at 15:18

1 Answers1

0

I validate by overriding store and update method.

/**
     * 新規登録時に、question_idとidea_idが両方同じデータがあるとバリデーションをする
     *
     * @return void
     */
    public function store()
    {
        $data = request()->all();
        $validator = Validator::make($data, [
            'question_id' => [
                'required',
                Rule::unique('idea_question_adoptions')->where(function ($query) use ($data) {
                    return $query->where('question_id', $data['question_id'])
                        ->where('idea_id', $data['idea_id']);
                }),
            ], [
            'question_id' => 'そのデータは既に存在しています。',
            ]
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }
        return $this->form()->store();
    }

      /**
     * 更新時にquestion_idとidea_idが両方同じデータがあるとバリデーションをする
     *
     * @param [type] $id
     * @return void
     */
    public function update($id)
    {
        $data = request()->all();

        $validator = Validator::make($data, [
            'question_id' => [
                'required',
                Rule::unique('idea_question_adoptions')->ignore($id)->where(function ($query) use ($data) {
                    return $query->where('question_id', $data['question_id'])
                        ->where('idea_id', $data['idea_id']);
                }),
            ], [
            'question_id' => 'そのデータは既に存在しています。'
            ]
        ]);
        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }
        return $this->form()->update($id);
    }
Naoki Oshiumi
  • 91
  • 1
  • 10