我检查数据库中数据的逻辑是否有效?

时间:2018-08-06 23:21:39

标签: json laravel laravel-5 eloquent laravel-5.6

我使用laravel 5.6

我有一个包含50万条记录的json文件。我想创建一个逻辑来检查数据库中每个记录的ID是否已经存在。如果尚不存在,那么将有一个数据插入过程。如果已经存在,将有一个数据更新过程。在更新数据之前,它将检查json文件和数据库中的last_modified_date是否相同或不同。如果不同,它将更新

我已经做出了逻辑。我只想确定我的逻辑是否有效

我的逻辑代码是这样的:

$path = storage_path('data.json');
$json = json_decode(file_get_contents($path), true);
foreach ($json['value'] as $value) {
    $last_modified_date = \Carbon\Carbon::parse($value['Last_Modified_Date']);
    $data = \DB::table('details')->where('id', '=', $value['Code'])->get();
    if ($data->isEmpty()) {
        \DB::table('details')->insert(
            [
                'id' => $value['Code'],
                'number' => $value['Number'],
                'last_modified_at' => $last_modified_date,
                ...
            ]
        );
    }
    else {
        \DB::table('details')
            ->where('id', '=', $value['Code'])
            ->where('last_modified_at', '<>', $last_modified_date)
            ->update([
                'id' => $value['Code'],
                'number' => $value['Number'],
                'last_modified_at' => $last_modified_date,
                ...
            ]);
    }
}

代码正在运行。但是过程似乎很漫长

您还有其他更好的解决方案吗?

更新

我发现使用updateOrCreate

的另一个解决方案

我这样尝试:

$path = storage_path('data.json');
$json = json_decode(file_get_contents($path), true);
foreach ($json['value'] as $value) {
    Details::updateOrCreate(
        [ 'id' => $value['Code'] ],
        [ 'number' => $value['Number'], 'last_modified_at' => $last_modified_date, ... ]
    );
}

你怎么看?

1 个答案:

答案 0 :(得分:1)

您不能在<>中使用updateOrCreate

我希望这段代码可以为您提供帮助:

$path = storage_path('data.json');
$json = json_decode(file_get_contents($path), true);
foreach ($json['value'] as $value) {
    $detail = Details::firstOrCreate(
        [ 'id' => $value['Code'] ],
        [ 'number' => $value['Number'], 'last_modified_at' => $last_modified_date, ... ]
    );
    if($detail->last_modified_at != $last_modified_date) {
        $detail->update([
            'number' => $value['Number'],
            'last_modified_at' => $last_modified_date,
            ...
        ]);
    }
}