Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何:导入到laravel时灵活的数据映射?_Php_Laravel_Import - Fatal编程技术网

Php 如何:导入到laravel时灵活的数据映射?

Php 如何:导入到laravel时灵活的数据映射?,php,laravel,import,Php,Laravel,Import,我目前正在尝试为我们的一个应用程序实现一个灵活且易于使用的导入服务。应用程序在后台使用Laravel运行,目前我们正在使用固定的csv导入。 这意味着:客户需要提供一个按我们的指南格式化的csv文件,以匹配数据库中的列 现在这很好,但肯定不是灵活的或直观的 现在我正试图想出一个更好的解决方案(例如MailChimp使用的csv导入向导) 但现在我完全迷路了。我不知道如何使用库这样的库来实现具有以下功能的解决方案: 接受csv或xls 让用户映射它的数据,以便它与我们的数据库列匹配 允许用户将多

我目前正在尝试为我们的一个应用程序实现一个灵活且易于使用的导入服务。应用程序在后台使用Laravel运行,目前我们正在使用固定的csv导入。
这意味着:客户需要提供一个按我们的指南格式化的csv文件,以匹配数据库中的列

现在这很好,但肯定不是灵活的或直观的

现在我正试图想出一个更好的解决方案(例如MailChimp使用的csv导入向导)

但现在我完全迷路了。我不知道如何使用库这样的库来实现具有以下功能的解决方案:

  • 接受csv或xls
  • 让用户映射它的数据,以便它与我们的数据库列匹配
  • 允许用户将多个源列合并到一个目标列
我的主要挑战是由用户接收数据,让他们自己选择映射。在使用诸如
ddeboer/data import
之类的库时,如何拆分此过程

还应该考虑到,数据库可能会在接下来的几个月内发生变化,如果可能的话,我不想回到我的源代码来实现这些变化

如果有人能为我指出正确的方向,我将不胜感激


谢谢大家!

我们提出的解决方案如下所示:

我们使用多条路线:

1/导入GET

2/导入帖子

3/导入地图获取

4/导入地图帖子

1) 使用用于上载csv文件的文件输入渲染视图

2) 将文件上载到临时路径,以便我们可以使用它。路径将保存到会话中,并由3)用于打开文件。由于我们必须处理许多不同的编码,upload函数会进行一些糟糕的解码/编码,以获得有效的utf8文件

/**
 * Upload the given file to a temp path
 *
 * @param Filesystem $filesystem
 * @param $filePath
 * @return string
 */
public function upload(Filesystem $filesystem, $filePath)
{
    $path = str_random(20);
    $fullPath = public_path('temp/' . $path . '.csv');

    if ( ! mb_detect_encoding($filesystem->get($filePath), mb_detect_order(), true))
        $filesystem->put($filePath, chr(239) . chr(187) . chr(191) . utf8_encode($filesystem->get($filePath)));

    $filesystem->move($filePath, $fullPath);

    return $path;
}
3) 呈现导入映射视图。将使用会话中的值加载该文件。如果未找到会话数据,则用户将重定向到1)


这并不难,是吗:-)

谢谢分享!我真的很想看看表单/导入帖子页面:)到底是哪一部分
/import POST
没有页面,因为它只上载文件并重定向到映射部分。
<th>
    <select name="col-name[{{ $i }}]" data-eq="{{ $i }}" class="form-control">
        <option value="">Datenbankspalte auswählen</option>
        @foreach($tableColumns as $key => $value)
            <option value="{{ $key }}">{{ $value }}</option>
        @endforeach
    </select>
</th>
/**
 * Import the uploaded file one row at a time
 *
 * @param $input
 * @return bool
 * @throws \Exception
 */
public function import(array $input)
{
    if ( ! array_key_exists('campaign_id', $input))
        throw new Exception();

    $columns = array_filter($input['col-name']);

    if (empty($columns))
        throw new Exception();

    $this->openFile($input['csvPath']);

    foreach ($this->readCsv(null, (array_key_exists('headers', $input) ? 1 : 0)) as $row)
    {
        $address = new $this->address;

        foreach ($columns as $key => $value)
        {
            if ($value == '')
                continue;

            $address->$value = $row[$key];
        }
        $address->save();
        $address->campaigns()
                ->attach($input['campaign_id'], ['client_id' => auth()->user()->client_id, 'user_id' => (array_key_exists('user_id', $input) ? $input['user_id'] : 0)]);
    }

    return true;
}