首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何:灵活的数据映射在进口到拉拉?

如何:灵活的数据映射在进口到拉拉?
EN

Stack Overflow用户
提问于 2015-06-16 13:46:32
回答 1查看 2.2K关注 0票数 1

我目前正在尝试为我们的一个应用程序实现一个灵活且易于使用的导入服务。该应用程序运行在Laravel的背景下,目前我们正在使用一个固定的csv导入。

这意味着:客户需要提供一个csv文件,按照我们的指导方针格式化,以匹配我们数据库中的列。

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

现在,我正在尝试提出一个更好的解决方案(例如,MailChimp使用的csv向导)。

但现在我完全迷路了。我不知道如何使用像https://github.com/ddeboer/data-import这样的库来实现具有以下特性的解决方案:

  • 接受csv或xls
  • 让用户映射它的数据,以便它与我们的数据库列匹配
  • 让用户将多个源列组合到一个目标列。

我面临的主要挑战是用户获取数据,让他们自己选择映射。当使用像ddeboer/data-import这样的库时,如何分割这个过程?

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

如果有人能给我指明正确的方向,我会很感激的。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-08 07:23:58

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

我们使用多条路线:

1. /import GET

2. /import POST

3. /import-map GET

4. /import-map POST

1)呈现带有文件输入的视图,用于上载csv-文件。

2)将文件上传到临时路径,这样我们就可以使用它了。路径被保存到会话中,并由3)用来打开文件。由于我们需要处理许多不同的编码,所以上传函数会执行一些讨厌的解码/编码来获得一个有效的utf8文件。

代码语言:javascript
复制
/**
 * 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)。

代码语言:javascript
复制
<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>

4)注意进口:

代码语言:javascript
复制
/**
 * 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;
}

这并不难,是吗?-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30869483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档