【问题标题】:How do I make the most effective and efficient logic to check the data in the database exist or not?如何制定最有效和最高效的逻辑来检查数据库中的数据是否存在?
【发布时间】:2019-01-12 23:37:19
【问题描述】:

我使用 laravel 5.6

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

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

我的逻辑代码是这样的:

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

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

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

【问题讨论】:

  • 如果您认为这是低效的,那您是对的;当您可能只做一个时,您正在执行 500 个选择查询。插入也可以批量完成
  • @lagbox 我只能这样做。我不知道还有其他方法。所以如果你有最好的解决方案,请回答这个问题

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


【解决方案1】:

updateOrCreate

您也可能会遇到想要更新现有模型或创建新模型(如果不存在)的情况。 Laravel 提供了一个 updateOrCreate 方法来一步完成。与firstOrCreate 方法一样,updateOrCreate 会持久化模型,因此无需调用save()

// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99]
);

在您的情况下,您的代码应该是这样的(首先创建 Details 模型):

$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'], ... ]
    );
}

【讨论】:

  • update 或 create 仍然执行选择然后插入或更新 .. 它并没有提高效率,相同数量的查询和相同的查询,它只是增加了一点开销现在不得不通过雄辩......虽然它“看起来”更干净
  • @lagbox 如果您认为它效率低下。你有什么更高效的解决方案?
  • @Mohsen Safari 我想问一下。我可以在updateOrCreate 上使用chunk 吗?因为我的记录是50万条数据,插入太长了。
  • @SuccessMan updateOrCreate 为每条json记录运行,所以你需要chunk你的json文件,但我认为chunk对插入时间没有影响。
【解决方案2】:

我认为这是最好的方法。 Eloquent return 是一个集合,因此您不能只验证您的字符串是否为空。

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多