【问题标题】:Is there a Limit row function in Laravel Excel import?Laravel Excel 导入中是否有限制行功能?
【发布时间】:2021-11-11 11:27:40
【问题描述】:

我正在使用 maatwebsite/excel 包导入 CSV 文件。我无法限制导入的行。就像我需要上传文件中的前“n”行一样。我看到了一个界面

WithLimit

但是当我将它与 Limit() 一起使用时。它会引发一些错误,例如我尝试插入的某些表值是空的。我认为它正在使用列的限制。有什么办法可以解决这个问题吗?

我的控制器

 class FinancialTransController extends Controller
{
    public function store(Request $request)
    {
        Excel::import(new FinancialTrans, request()->file('myfile'));
        return 'success';
    }
}

这是我的导入类

class FinancialTrans implements ToModel,WithHeadingRow

{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {  
        return new FinancialTran([
             'module_id' =>$row['sr'],
             'tran_id'=>$row['sr'],
             'amount'=>$row['sr'],
             'crdr'=>$row['sr'],
             'tran_date'=>$row['date'],
             'acad_year'=>$row['academic_year'],
             'entry_mode'=>$row['sr'],
             'voucher_number'=>$row['voucher_no'],
             'br_id'=>$row['sr'],
        ]);
    }
    public function headingRow(): int
    {
        return 6;
    }

}

【问题讨论】:

  • 你能说明你是如何导入 csv 的吗?
  • 可能您遇到了一些与 excel 导入行限制无关的迁移或数据插入问题。
  • @Kim De Guzman,如果我没有设置限制,数据插入工作没有任何问题。
  • @mrhn 谢谢,我已经更新了问题。
  • 在你的导入类中......你是如何使用 WithLimit 的

标签: laravel laravel-excel


【解决方案1】:

WithHeadingRow 加载所有先前的行。改用 WithStartRow 接口。

use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Maatwebsite\Excel\Concerns\WithLimit;

class FinancialTrans implements ToModel, WithLimit, WithStartRow
{
    protected $startRow;

    public function __construct(int $startRow)
    {
        $this->startRow = $startRow;
    }
    ... 
    public function startRow(): int
    {
        return $this->startRow;
    }

    public function limit(): int
    {
        return 10;
    }

【讨论】:

    【解决方案2】:

    如果你查看maatwebsite/excel中的code,你会发现它是一个带有限制功能的接口,这个你必须实现。如果您使用的是 IDE,它通常会建议您实现这些方法。

    use Maatwebsite\Excel\Concerns\WithLimit;
    
    class FinancialTrans implements ToModel,WithHeadingRow, WithLimit
    {
        public function limit(): int
        {
            return 100; // only take 100 rows
        }
        ...
    }
    

    【讨论】:

    • 我做了同样的事情,它抛出一个错误:Illuminate\Database\QueryException SQLSTATE[23000]:完整性约束违规:1048 列'module_id'不能为空(SQL:插入financial_trans(@ 987654325@, tran_id, amount, crdr, tran_date, acad_year, entry_mode, voucher_number, br_id) 值 (?, ?, ?, ?, ?, ?, , ?, ?))
    • 但这与你的问题完全无关。
    • Module_id 不能为空,要么您的数据为空,要么模型上的 module_id 字段不可填写
    • 但是 module_id 怎么不会为空,如果整个有限的行都被插入,我认为这是用“withLimit”接口限制列。
    • 错误非常具体:) 你可以插入 if (!$row['sr']) {dd('module_id is null to check');}
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2014-01-17
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多