【问题标题】:Is it possible to import data to multiple tables from one excel sheet using laravel excel?是否可以使用 laravel excel 从一张 excel 表中将数据导入多个表?
【发布时间】:2019-06-16 23:06:15
【问题描述】:

我们正在创建一个应用程序,用户可以上传包含多个表格信息的 Excel 文件。 (例如,请参见下面的屏幕截图)。是否可以拆分这些数据并创建多个模型以使用 laravel excel 导入数据库?如果没有,是否有您推荐使用的其他软件包?

如果我错了,请纠正我,但据我了解,控制器中每次导入只能有一个模型。

控制器:

class ImportsController
{
    public function import()
    {
        Excel::import(new DataImport, 'testSheet.xlsx'); //only allows for one model

        return redirect('/')->with('success', 'All good!');
    }
}

进口:

class DataImport implements ToModel
{
    public function model(array $row)
    {
        // need way to create and return multiple models
        return new Data([

        ]);
    }
}

路线:

Route::get('/import', 'ImportsController@import');

第一行是表名,第二行是字段名,后面都是数据

【问题讨论】:

  • 答案是肯定的。从 Excel 中提取数据后,您可以随意处理数据。您可以在控制器中使用任意数量的模型。这仅取决于您如何使用它们。
  • @Indra 感谢您的回复。抱歉,我对 laravel 和 php 很陌生。你能提供一个例子来说明你如何做到这一点吗?我已经编辑了上面的问题以包含更多信息。据我了解,DataImport 中的“模型”函数通常返回一个在该函数中创建的模型。返回该模型后,导入方法将其导入数据库。那么如何通过读取 excel 表中的表格行来创建多个模型呢?

标签: php excel laravel


【解决方案1】:

您可以导入到集合中,而不是导入到模型中,并在每一行上创建两个模型:

namespace App\Imports;

use App\EmployeeType;
use App\Contact;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;

class EmployeesImport implements ToCollection
{
    public function collection(Collection $rows)
    {
        foreach ($rows as $row) 
        {
            EmployeeType::create([
                'name' => $row[1],
            ]);

            Contact::create([
                'institution' => $row[3],
                'type' => $row[4],
                'address' => $row[5],
            ]);
        }
    }
}

阅读更多here

使用WithMultipleSheets 关注点可以一次导入多个工作表并进行多个导入,但据我所知,您不能使用它从单个工作表创建多个导入。

【讨论】:

  • 恐怕像这样使用toCollection 接口并调用create 方法会对每一行进行插入查询,这可能不是我们想要的。而使用toModel 接口和withBatchInserts 将一次性全部插入。不幸的是,withBatchInserts 不适用于 toCollection
  • 你能得到每个EmployeeType的id并在Contact表中使用吗?
  • @Mahdi 是的,create 方法返回存储的模型实例,因此您可以将其保存在变量$employeeType = EmployeeType::create(...); 中,并在创建联系人时使用$employeeType->id
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多