taxaos / doctrine-bulk
简单的类,允许对Doctrine实体进行批量操作(仅支持MySQL的upsert操作)
4.0.1
2023-01-16 08:52 UTC
Requires
- php: >=8.0
- ext-pdo: *
- doctrine/annotations: ^1.13.2
- doctrine/orm: ^2.5
- symfony/cache: ^v5.4.0
Requires (Dev)
- phpstan/phpstan: ^1.9
- phpunit/phpunit: >8.5.30
- squizlabs/php_codesniffer: ^3.7
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; } }