ajcastro/insert-update-many

Laravel 对 Eloquent 模型集合进行批量插入或批量更新的工具。

v0.1.0 2019-07-12 14:08 UTC

This package is auto-updated.

Last update: 2024-09-13 02:08:22 UTC


README

Laravel 对 Eloquent 模型集合进行批量插入或批量更新的工具。执行批量插入或更新操作时,将执行单个查询。这将更新模型及其表的 created_atupdated_at 列。方法名 insertManyupdateMany 基于曹颖的方法名 saveManyinsertManyupdateMany 都可以接受模型集合或纯数组数据。

安装

composer require ajcastro/insert-update-many

使用方法

批量插入

直接传递数组或模型集合,与 Laravel 内置的 insert() 方法不同,后者仅接受数组。这已设置 created_atupdated_at 列。

$users = factory(User::class, 10)->make();
User::insertMany($users);

工作原理

传入的模型集合将被转换为数组形式,仅包括可填充属性,并将其数组形式传递给 Laravel 的原生 insert() 方法。

批量更新

更新数组或模型集合。这将针对所有传入的模型执行单个更新查询。仅包括脏或已更改的属性将包含在更新中。这将更新模型及其表的 updated_at 列。

User::updateMany($users); // update many models using id as the default key
User::updateMany($users, 'id'); // same as above
User::updateMany($users, 'username'); // use username as key instead of id

指定要更新的列

User::updateMany($users, 'id', ['email', 'first_name', 'last_name']);

工作原理

这将生成如下查询

UPDATE
   `users`
SET
   `email` =
   CASE
      WHEN
         `id` = '426'
      THEN
         'favian.russel@example.com'
      WHEN
         `id` = '427'
      THEN
         'opurdy@example.org'
      WHEN
         `id` = '428'
      THEN
         'kaylah.hyatt@example.com'
      ELSE
         `email`
   END
, `first_name` =
   CASE
      WHEN
         `id` = '426'
      THEN
         'Orie'
      WHEN
         `id` = '427'
      THEN
         'Hubert'
      WHEN
         `id` = '428'
      THEN
         'Mikayla'
      ELSE
         `first_name`
   END
, `last_name` =
   CASE
      WHEN
         `id` = '426'
      THEN
         'Weissnat'
      WHEN
         `id` = '427'
      THEN
         'Wiza'
      WHEN
         `id` = '428'
      THEN
         'Keeling'
      ELSE
         `last_name`
   END
WHERE
   `id` IN
   (
      426, 427, 428
   );