Json 如何使用最有效的逻辑检查数据库中的数据是否存在?

Json 如何使用最有效的逻辑检查数据库中的数据是否存在?,json,laravel,laravel-5,eloquent,laravel-5.6,Json,Laravel,Laravel 5,Eloquent,Laravel 5.6,我使用的是laravel 5.6 我有一个json文件,其中包含50万条记录。我想创建一个逻辑来检查数据库中是否已经存在每条记录的id。如果它还不存在,那么将有一个数据插入过程。如果它已经存在,将有一个数据更新过程 我已经讲了逻辑。我只是想确定我的逻辑是否有效 我的逻辑代码如下: $path = storage_path('data.json'); $json = json_decode(file_get_contents($path), true); foreach ($json['value

我使用的是laravel 5.6

我有一个json文件,其中包含50万条记录。我想创建一个逻辑来检查数据库中是否已经存在每条记录的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'],
                ...
            ]);
    }
}
代码正在运行。但这个过程似乎真的很长


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

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

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

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


在您的情况下,您的代码应该如下所示(首先创建
详细信息
模型):

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


在您的情况下,您的代码应该如下所示(首先创建
详细信息
模型):


如果你认为这是低效的,你是对的;您正在执行500个select查询,而您可能只执行一个查询。插入也可以在中完成bulk@lagbox我只能这样做。我不知道还有别的办法。因此,如果你有最好的解决方案,请回答这个问题如果你认为这是低效的,那么你是正确的;您正在执行500个select查询,而您可能只执行一个查询。插入也可以在中完成bulk@lagbox我只能这样做。我不知道还有别的办法。因此,如果您有最好的解决方案,请回答此问题更新或创建仍会执行选择,然后执行插入或更新。。这并没有使它变得更高效,同样的查询量和相同的查询量,只是增加了一点点的开销,现在必须通过雄辩的。。。虽然它“看起来”cleaner@lagbox如果你认为这是低效的。“你的解决方案是什么更有效?”我想问问莫森·萨法里。我可以在
updateOrCreate
上使用
chunk
吗?因为我的记录有50万个数据,插入太长。@SuccessMan
updateOrCreate
对每个json记录都运行,所以你需要
chunk
你的json文件,但我认为
chunk
对插入时间没有影响。update或create仍然会选择然后插入或更新。。这并没有使它变得更高效,同样的查询量和相同的查询量,只是增加了一点点的开销,现在必须通过雄辩的。。。虽然它“看起来”cleaner@lagbox如果你认为这是低效的。“你的解决方案是什么更有效?”我想问问莫森·萨法里。我可以在
updateOrCreate
上使用
chunk
吗?因为我的记录有50万个数据,插入太长。@SuccessMan
updateOrCreate
对每个json记录都运行,所以你需要
chunk
你的json文件,但我认为
chunk
对插入时间没有影响。
// 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]
);
$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'], ... ]
    );
}