当前位置: 首页 > 知识库问答 >
问题:

在Laravel中插入数据的最快方法[重复]

狄宪
2023-03-14

我已经创建了复制分支用户权限的方法。权限通常为0到120个项目。运行此方法将此(0到120)项插入到7个用户ID需要35-55秒才能插入到表中。

/**
 * Copy Branch User Permissions
 *
 * @param Int
 * @param Int
 * @param Int
 * @return Array
 */
public function copyBranchUserPermissions($branchIdFrom, $branchIdTo, $userId)
{
    $permissions = BranchPermissionUser::get()
        ->where('branch_id', $branchIdFrom)
        ->where('user_id', $userId);

    foreach($permissions as $permission) {
        $permission->create([
            'branch_id' => $branchIdTo,
            'permission_id' => $permission->permission_id,
            'user_id' => $userId
        ]);
    }

    return $permissions;
}

我需要优化这个过程,因为数据插入的性能很慢。我在想如果超过10个用户,那么这个过程会花费太长时间。有没有办法提高插入数据的性能速度?

提前谢谢你!

共有3个答案

孙斌
2023-03-14

您可以使用雄辩的fill()方法。

public function copyBranchUserPermissions($branchIdFrom, $branchIdTo, $userId)
{
    $permissions = BranchPermissionUser::where('branch_id', $branchIdFrom)
                    ->where('user_id', $userId)
                    ->get();

    foreach($permissions as $permission) {
      $permission->fill([
        'branch_id' => $branchIdTo,
        'permission_id' => $permission->permission_id,
        'user_id' => $userId
      ]);
       $permission->save();
    }
    return $permissions;
}

这将帮助您提高函数的速度,因为您循环的是您从查询中获得的结果,而不是查询本身。为了使用填充()函数,您的数据类型必须是可填充的

史淳
2023-03-14

您可以使用雄辩的insert()方法。

public function copyBranchUserPermissions($branchIdFrom, $branchIdTo, $userId)
{
    $permissions = BranchPermissionUser::where('branch_id', $branchIdFrom)
                    ->where('user_id', $userId)
                    ->get();

    $data=[];
    foreach($permissions as $permission) {
      $data[] = [
        'branch_id' => $branchIdTo,
        'permission_id' => $permission->permission_id,
        'user_id' => $userId
      ];
    }
    BranchPermissionUser::insert($data);
    return $permissions;
}
谢骏奇
2023-03-14

如果您非常需要速度优化,那么最好坚持使用查询生成器,而不是使用雄辩的方式。

更多信息:Laravel Eloquent vs query builder-为什么使用Eloquent来降低性能

获取特定于用户和分支的权限时

 $permissions = BranchPermissionUser::get()
    ->where('branch_id', $branchIdFrom)
    ->where('user_id', $userId);

首先从数据库表加载所有数据,并对所有数据生成的集合执行where。

您应该在get方法之前执行其中条件,因此它将在SQL端处理,这将比从get雄辩方法创建的集合中处理要快得多。

$permissions = BranchPermissionUser::query()
                        ->where('branch_id', $branchIdFrom)
                        ->where('user_id', $userId)
                        ->get();

此外,您将循环遍历所有权限,并在数据库中创建每个权限。

 foreach($permissions as $permission) {
    $permission->create([
        'branch_id' => $branchIdTo,
        'permission_id' => $permission->permission_id,
        'user_id' => $userId
    ]);

这将为每个创建创建一个查询。这非常慢,而且不是同时保存多行数据的最佳做法。

您应该使用插入方法来插入所有的行,这将创建一个SQL查询,并且速度更快,也更优化。

注意:插入方法在插入行时不会处理created_at和updated_at字段。因此,您必须手动为它们添加数据。

$data=[];
foreach($permissions as $permission) {
  $data[] = [
    'branch_id' => $branchIdTo,
    'user_id' => $userId,
    'permission_id' => $permission->permission_id,
    'created_at' => now(),
    'updated_at' => now(),
  ];
}
BranchPermissionUser::insert($data);

now()是一个Laravel助手,它为当前时间创建一个新的Carbon实例:。

 类似资料:
  • 嗨,我已经搜索并试图解决这个问题,但未能找到解决方案,抱歉占用了你的时间。我在laravel中插入一组数据与查询生成器一次插入多个数据。 有没有办法检查表中的值是否存在,然后更新,否则插入。如果所有数据成功更新或插入,我想从查询结果中返回或。我想解决它与laravel查询生成器。谢啦

  • 我正在尝试从一个oracle数据库迁移到另一个。我的选择查询非常复杂,它返回大约2000万条记录。当我尝试执行时: 大约需要20个小时。 有什么不同的迁移方式吗?你能给我一些建议吗? 谢谢你的建议。 编辑:我创建了一个新表格,如下所示 将表XYZ创建为从yyy join zzz join ttt等中选择a,b,c,bla blaa 大约需要2分钟。 现在我正在尝试从XYZ插入到我的原始表。 还剩1

  • 如果我想在数据帧中删除重复的索引,由于明显的原因,以下方法不起作用: 和 查找名为“index”的列 如果我想删除索引,我必须执行以下操作: 有没有更高效的方法?

  • 问题内容: 我试图创建一个随机的实数,整数,字母数字,字母字符串,然后写入文件,直到文件大小达到 10MB 为止。 代码如下。 大约需要 225.953125秒 才能完成。如何提高此程序的速度?请提供一些代码见解? 问题答案: 观察到的“缓慢”的两个主要原因: 您的while循环很慢,大约有一百万次迭代。 您没有正确使用I / O缓冲。不要进行太多系统调用。目前,您正在拨打约一百万次。 首先在Py

  • 我正在创建一个多租户应用程序,在该应用程序中,我基于子域连接到该特定租户的数据库。 下面是执行此操作的代码: 这是连接数据库的最佳方式,还是存在任何问题,因为我是从性能的角度考虑的,因为每次连接数据库时都有不同的子域。最好的方法是什么?

  • 我对将大型集合插入cassandra数据库的最快方法有点困惑。我了解到我不应该使用批量插入,因为它是为原子性而创建的。甚至Cassandra也给了我一个信息,让我使用异步写来提高性能。我使用了没有“batch”关键字的最快插入代码: 出发地:https://medium.com/@fondev/cassandra-batch-loading-non-the-batch-keyword-40f00e