taxaos/doctrine-bulk

简单的类,允许对Doctrine实体进行批量操作(仅支持MySQL的upsert操作)

4.0.1 2023-01-16 08:52 UTC

This package is auto-updated.

Last update: 2024-09-16 12:40:34 UTC


README

添加了使用doctrine模式对象和ORM对象将实体或数组批量上插/插入到数据库的能力(仅MySQL)。

INSERT ... ON DUPLICATE KEY UPDATE Statement for ORM objects
    INSERT INTO t1 (a,b,c) VALUES (1,2,3)
    ON DUPLICATE KEY UPDATE c=c+1;

https://dev.mysqlserver.cn/doc/refman/8.0/en/insert-on-duplicate.html

警告:此功能将仅取您的ORM对象列表,并创建insert on duplicate sql查询

  • 支持的关系/连接类型为ONE_TO_ONE AND MANY_TO_ONE
  • 支持生命周期回调事件:Events::prePersist / Events::preUpdate
  • 您可以将ORM对象从会话中分离出来,以避免由ORM触发的插入/更新。**我在这里选择了给您灵活性,使用$detach参数。
  • 更改将分批发送到数据库

如果世界很美好,Doctrine能够为MySQL执行其他操作,而不是单个的插入/更新查询,我就不需要做这个了。

用更少的能量使用来保护地球 :)

示例

默认用法

<?php
declare(strict_types = 1);

use Doctrine\ORM\EntityManagerInterface;
use DoctrineBulk\Bulk\BulkUpsert;

/**
 * Class DbWrite
 */
class DbWrite {
    private EntityManagerInterface $manager;

    /**
     * Creates two users in one query.
     *
     * @return int
     */
    public function updateExistingUsersAndCreateTwoUsers(): int
    {
        $dbUsers = []; // imagine some loaded users from DB and some changed data from your code 

        $bulkUpsert = new BulkUpsert($this->manager, User::class);

        foreach ($dbUsers as $dbUser) {
            $bulkUpsert->addEntity($dbUser, detach: true);
        }

        // now 2 new users
        $bulkUpsert->addEntity(new User('user 1', 'password'), detach: true);
        $bulkUpsert->addEntity(new User('user 2', 'password'), detach: true);

        $firstInsertedId = (int) $bulkUpsert->execute(maxRows: 1000);

        return $firstInsertedId;
    }
}

源自 https://github.com/6dreams/doctrine-bulk