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

#javascript #laravel #eloquent #laravel-8

Вопрос:

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

Вот мой Register.blade.php

 <div class="form-group row">
                            <label for="Org2" class="col-md-4 col-form-label text-md-right">Org3</label>

                            <div class="col-md-6">
                                <select name="Org3[]" id="Org3" multiple class="form-control">
                                    @foreach($Org3_list as $use)
                                    @if(!empty($use))
                                    <option value="{{$use->CurrOrg3}}">{{$use->CurrOrg3}}</option>
                                    @endif
                                    @endforeach
                                    <option value="Admin">Admin</option>
                                </select>

                                @error('Org3')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>
 

А это мой регистраторконтроллер:

  protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'Org1' => [ 'string'],
            'Org2' => ['string'],
            'Org3' => ['string'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return AppModelsUser
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'Org1' => $data['Org1'],
            'Org2' => $data['Org2'],
            'Org3' => $data['Org3'],
        ]);
        Mail::to($data['email'])->send(new WelcomeMail($user));

        return $user;
    }
 

Любая помощь, как вставить несколько значений, выбранных из выпадающего списка.

Комментарии:

1. Можете ли вы отредактировать свой вопрос с фактической ошибкой, пожалуйста?

2. Вставляется только первое выбранное значение, и я хочу вставить несколько выбранных значений, разделенных запятыми, в базу данных @toyi

Ответ №1:

Org3 это не a string , это an array , поэтому вам нужно обращаться с этим как с таковым.

При проверке Org3 вы хотите убедиться, что это массив. Обратите внимание, что вы можете захотеть проверить другие аспекты массива, такие как min длина, или вы можете согласиться nullable . Кроме того, вы можете проверить значение каждого элемента в Org3 массиве (никогда не предполагайте, что входные данные будут действительными).

 // validate that Org3 is an array
'Org3' => ['array'],

// validate that each element in Org3 is a string an exists in a database table
'Org3.*' => ['string', 'exists:table'],
 

Есть и другие проверки, которые вы могли бы выполнить, но вы можете провести их поиск.

Предполагая, что проверка прошла успешно, вам необходимо сохранить Org3 ее в базе данных.

Одним из вариантов было бы использовать implode массив, а затем сохранить результат в базе данных в виде строки, разделенной разделителями:

 implode(',', $request->Org3);
 

Проблема, с которой я сталкиваюсь с первым вариантом, заключается в том, что он неуклюж, когда вы хотите выполнить поиск a User на основе одного из нескольких возможных значений User , для Org3 которых имеет значение a.

Второй вариант-создать связь между User и Org3 , а затем сохранить каждое значение Org3 как запись этой связи. Это немного больше работы, но, возможно, более практично.

Обновление 1

Поскольку вы просто хотите вставить в свою базу данных строку-разделитель, вы можете сделать следующее:

 protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
        'Org1' => [ 'string'],
        'Org2' => ['string'],
        'Org3' => ['array'],
        'Org3.*' => ['string'],
    ]);
}

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        'Org1' => $data['Org1'],
        'Org2' => $data['Org2'],
        'Org3' => implode(',', $data['Org3']),
    ]);
    Mail::to($data['email'])->send(new WelcomeMail($user));

    return $user;
}
 

Я мало что сделал с точки зрения проверки, вам решать, что подходит или не подходит для вашего варианта использования.

Комментарии:

1. Спасибо.. Теперь я получаю эту ошибку «Преобразование массива в строку», когда я использую массив

2. Можете ли вы указать мне, где мне нужно изменить приведенный выше код?

3. @prashant Я добавил обновление с некоторыми примерами кода.