验证数组以发送给控制器。 Laravel

时间:2019-12-03 15:25:16

标签: laravel

我希望能够检查是否发送了正确的数据,如果没有,请告知用户。这样做的上下文是我导入一个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。有办法吗?

2 个答案:

答案 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()的自定义消息