重新加载视图时重复的数据

时间:2017-01-11 02:51:05

标签: php laravel

我试图从文本文件中获取数据并将数据传递给数据库。问题是,每次重新加载视图时,数据都会被发送,这意味着我会获得重复的数据,有没有办法防止这种情况发生?也许截断文件或保存已处理的最后一行的行号?

此外,生成文本文件的方式是我每天都会获得一个新文本文件,其中包含文件名称上的日期,所以我想的另一种方法是创建一个新的数据库表,我会在其中标记每个文件文件我处理为"已处理"所以函数不会多次处理同一个文件。

以下是文本文件的示例:

1618 0002 9    9  505   04129284134    4141191269    4141191269 56984 4      002 001 4

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4         

1619 0000 9    6               1172    2129922686    2129922686       4      013     0

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4        

1619 0000 7    6  521         1188#          1172          1172       0          001 4

1606 0000 9                    1159    4169191388    4169191388       4      012     0

1607 0009 7    9  505   04129284134          1245          1245 56984 4         

以下是我在路线文件中使用的功能:

Route::get('calls', function () {
    foreach (file(public_path() . "/calls.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
        $calls                 = new Calls();
        $calls->time           = trim(substr($line, 0, 4));
        $calls->duration       = trim(substr($line, 5, 4));
        $calls->cond_code      = trim(substr($line, 10, 1));
        $calls->code_dial      = trim(substr($line, 15, 1));
        $calls->code_used      = trim(substr($line, 18, 3));
        $calls->dialed_num     = trim(substr($line, 24, 11));
        $calls->calling_num    = trim(substr($line, 39, 11));
        $calls->clg_num_in_tac = trim(substr($line, 53, 11));
        $calls->auth_code      = trim(substr($line, 64, 5));
        $calls->frl            = trim(substr($line, 70, 1));
        $calls->ixc_code       = trim(substr($line, 77, 3));
        $calls->in_crt_id      = trim(substr($line, 85, 3));
        $calls->save();
    }
    return View::make('test')
        ->with('calls', Calls::all());

});

1 个答案:

答案 0 :(得分:0)

问题在于实施。

使用当前实现,如果您需要限制重复项,则需要将每个输入与数据库记录相匹配。

但这是一个非常糟糕的设计并且非常不合理。

您要做的是在表单中添加file input字段,并在表单中添加POST。然后处理这样的表格。

Route::post('calls', function () {
    // your code goes here...
});

完成后,您可以重定向到另一条路线。