Laravel Excel Maatwebsite 3.1 Проверка строки не работает - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь найти дублирующиеся строки в массиве импорта, используя проблему 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'));

Ответы [ 2 ]

0 голосов
/ 31 мая 2019
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()]);
    }

Exemple image

0 голосов
/ 04 марта 2019

Получил этот рабочий импорт в коллекции

namespace App\Imports;

use App\Contactlist;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;

class ContactsImport implements ToCollection
{ 
private $data; 

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

/**
* @param array $row
*/
public function collection(Collection $rows)
{
    // Initialize number
    $numbers = array();

    foreach ($rows as $row) {
        //Skip empty rows
        if (!isset($row[0])) 
        continue;

        //Skip number previously added using in_array
        if (in_array($row[0], $numbers))
            continue;

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

        // Add new number to array
        $numbers[] = $row[0];
    }

 }

}
...