我希望能够检查是否发送了正确的数据,如果没有,请告知用户。这样做的上下文是我导入一个Excel文件,发送到控制器的数据不是文件本身而是里面的数据,在我的项目中,我有4种不同的导入选项(用户,教室,专业,课程),并且我想确保每次导入都发送正确的数据,以避免出现laravel错误,而是能够控制向用户显示错误消息中的错误。如果文件错误并且没有所需的所有数据,或者缺少名称的特定消息,则类似"This is the wrong Excel file, make sure you are uploading the correct file!"
之类的。
所发送的是一个数组,其中包含来自excel的行数,例如25个用户,该数组中有25个对象,我将显示with与在每个对象中
USER
"NOMBRE" => "Abbey Knapp"
"CEDULA" => 12345
"CARNET" => 97532
"CORREO" => "ak@email.com"
"PASSWORD" => "password"
"TIPO_USUARIO" => 4
"CATEGORIA_USUARIO" => "9, 4, 1"
CLASSROOM
"NOMBRE" => "Aula1"
COURSE
"NOMBRE" => "Class 1"
"CODIGO" => 4568
"CARRERA" => 1
MAJOR
"NOMBRE" => "Bach ING"
"CODIGO" => 1458
这就是要发送的内容,对于专业,课程和教室来说,所有这些数据都是必需的,对于用户“ CATEGORIA_USUARIO”不是必需的,但是其他所有内容都是
这是我当前的代码,我做了一个UserImportRequest
public function authorize()
{
return true;
}
public function rules()
{
return [
'*.NOMBRE' => 'required',
'*.CEDULA' => 'required|unique:users,card|numeric',
'*.CARNET' => 'required|unique:users,scard|numeric',
'*.CORREO' => 'required|email',
'*.PASSWORD' => 'required',
'*.TIPO_USUARIO' => 'required|exists:user_types|numeric'
];
}
public function messages()
{
return [
'NOMBRE.required' => 'El nombre es requerido!',
'CEDULA.required' => 'La cedula es requerido!',
'CEDULA.unique' => 'La cedula debe ser unica!',
'CARNET.required' => 'El carnet es requerido!',
'CARNET.unique' => 'El carnet debe ser unico!',
'CORREO.required' => 'El correo es requerido!',
'CORREO.email' => 'El correo debe tener el formato correcto!',
'PASSWORD.required' => 'La contraseña es requerido!',
'TIPO_USUARIO.required' => 'El tipo de usuario es requerido!',
'TIPO_USUARIO.exists' => 'El tipo de usuario debe existir en la base de datos!',
];
}
在我的控制器导入功能中
public function import(UserImportRequest $request)
{
DB::beginTransaction();
$validated = $request->validated();
$users = $validated->all();
foreach ($users as $item) {
// save users in here
}
DB::commit();
return back();
}
我收到此错误
未找到列:1054“ where子句”中的未知列“ TIPO_USUARIO”(SQL:从
user_types
中选择count(*)作为聚集,其中TIPO_USUARIO
= 3)
问题是,在Excel文件中,列名是西班牙语,与数据库上的名称不匹配,因此当我执行'*.TIPO_USUARIO' => 'required|exists:user_types|numeric'
时,无法检查表user_types中是否存在该列我仍然要验证这一点,用户表上的名称为user_type_id
。有办法吗?
答案 0 :(得分:2)
问题是,在Excel文件中,列名是西班牙语,与数据库上的名称不匹配,因此当我执行'* .TIPO_USUARIO'=>'required | exists:user_types | numeric'时,可以不会检查表user_types中是否存在,但是我仍然要对此进行验证,用户表上的名称是user_type_id。有办法吗?
要将字段映射到数据库中的其他列,可以执行以下操作:
return [
'*.TIPO_USUARIO' => 'required|exists:user_types,user_type_id|numeric'
];
对于注释中有关处理错误消息的问题...当您重定向回表单提交页面时,可以在blade中使用错误指令:
<input id="password" type="text" class="@error('password') is-invalid @enderror">
@error('password')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
此处有更多详细信息:Displaying Validation Errors
答案 1 :(得分:1)
对于原始问题:
如果未指定column选项,那么将使用字段名称。看一下Specifying A Custom Column Name。
因此您可以通过以下方式进行操作:
'*.TIPO_USUARIO' => 'required|exists:user_types|numeric|exists:user_types,id' // where id is the column name
对于评论中的问题:
如何使用同一项目中的数据发送自定义验证消息?就像如果密码丢失一样,请发送一条消息:
'user.name'
的密码丢失。这样的东西?
您可以在withValidator()
类的UserImportRequest
方法中,在事后挂钩中完成此操作(请注意,这只是一个近似值,所以您有了主意)。
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
$validator->after(function ($validator) {
$users = collect($this);
$users->each(function ($user, $key) use ($validator) {
if ( !$user['PASSWORD'] ) {
$validator->errors()->add('PASSWORD', 'the password is missing for '.$user['NOMBRE']);
}
});
});
}
请注意,您必须在PASSWORD
方法中删除messages()
的自定义消息