#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 Я добавил обновление с некоторыми примерами кода.