首页 > 解决方案 > Laravel Excel Maatwebsite 3.1 行验证不起作用

问题描述

我正在尝试使用 WithValidation 关注点在导入数组上查找重复的行(稍后将使用 SkipsOnError 删除重复的行)。但是在我的导入类中设置的用于查找重复行的验证似乎不起作用。当我上传包含重复数据的 excel 文件(只是没有标题的列)时,没有返回错误并且所有行都导入数据库

<?php

namespace App\Imports;

use App\Contactlist;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithValidation;

class ContactsImport implements ToModel, WithValidation
{
    use Importable;

    private $data; 

    public function __construct(array $data = [])
    {
        $this->data = $data; 
    }

    public function model(array $row)
    {
        if (!isset($row[0])) {
            return null;
        }

        return new Contactlist(array_merge([
            'nums'   => $row[0],
        ], $this->data));

    }

    public function rules(): array
    {
        return [
            //find duplicate records
            '0.*' => 'distinct',
            //'*.0' => 'distinct' Tried this also
        ];
  }

}

我的控制器的代码片段

$data = [
            'contact_id' => $contact->id,
        ];

        Excel::import(new ContactsImport($data), request()->file('contact_file'));

标签: laravel-5.7laravel-excel

解决方案


class ExempleImport implements ToCollection, WithHeadingRow
{

   /** @var Collection */
   public $collection;  


  /**
   * @param Collection $collection
   */
  public function collection(Collection $collection)
  {
    $this->collection = $collection->transform(function ($row) {

        $this->validationFields($row);

        return [
            'curso'             => $row['curso'],
            'marca'             => $row['marca'],
            'status'            => $row['status_do_curso'],
            'emissor'           => $row['emissor_cliente'],
            'nome_da_conta'     => $row['nome_da_conta'],
        ];
    });
  }

  public function validationFields( $row )
  {

      $customMessages = [
          'required' => 'O campo :attribute deve estar preenchido'
      ];

      Validator::make($row->toArray(), [
          'curso' => 'required',
          'marca' => 'required',
          'status_do_curso' => 'required',
          'emissor_cliente' => 'required',
          'nome_da_conta' => 'required',
      ], $customMessages)->validate();
 }
}

在您的控制器中

    $exampleImport = new ExampleImport;

   try{
        Excel::import( $exampleImport, $updateFile);
    }catch ( ValidationException $e ){

        return response()->json(['success'=>'errorList','message'=> $e->errors()]);
    }

示例图片


推荐阅读