wwardaww / insert-on-duplicate-key
一个用于MySQL INSERT ON DUPLICATE KEY UPDATE的特质。
1.2.6
2018-01-29 15:42 UTC
Requires (Dev)
- illuminate/database: ^5.1
- phpunit/dbunit: ^2.0
- phpunit/phpunit: ~5.0
README
此特质是从 yadakhov/ insert-on-duplicate-key(v1.2.0) 分叉而来。
原始包状态
Insert Duplicate Key Update 是进行大量插入的一个快速方法。
这是一个旨在与 Laravel 的 Eloquent ORM 一起使用的特质。
安装
composer require wwardaww/insert-on-duplicate-key
代码示例
use Illuminate\Database\Eloquent\Model; use Wwardaww\InsertOnDuplicateKey; /** * Class User. */ class User extends Model { // The function is implemented as a trait. use InsertOnDuplicateKey; }
多值插入。
$users = [ ['id' => 1, 'email' => 'user1@email.com', 'name' => 'User One'], ['id' => 2, 'email' => 'user2@email.com', 'name' => 'User Two'], ['id' => 3, 'email' => 'user3@email.com', 'name' => 'User Three'], ];
INSERT ON DUPLICATE KEY UPDATE ANOTHER SCHEME
User::insertOnDuplicateKey($users,null,'anotherScheme');
-- produces this query INSERT INTO `anotherScheme`.`users`(`id`,`email`,`name`) VALUES (1,'user1@email.com','User One'), (2,'user3@email.com','User Two'), (3,'user3email.com','User Three') ON DUPLICATE KEY UPDATE `id` = VALUES(`id`), `email` = VALUES(`email`), `name` = VALUES(`name`)
INSERT ON DUPLICATE KEY UPDATE DEFAULT SCHEME
User::insertOnDuplicateKey($users,null);
-- produces this query INSERT INTO `homestead`.`users`(`id`,`email`,`name`) VALUES (1,'user1@email.com','User One'), (2,'user3@email.com','User Two'), (3,'user3email.com','User Three') ON DUPLICATE KEY UPDATE `id` = VALUES(`id`), `email` = VALUES(`email`), `name` = VALUES(`name`)
User::insertOnDuplicateKey($users, ['email']);
-- produces this query INSERT INTO `users`(`id`,`email`,`name`) VALUES (1,'user1@email.com','User One'), (2,'user3@email.com','User Two'), (3,'user3email.com','User Three') ON DUPLICATE KEY UPDATE `email` = VALUES(`email`)
INSERT IGNORE
User::insertIgnore($users);
-- produces this query INSERT IGNORE INTO `users`(`id`,`email`,`name`) VALUES (1,'user1@email.com','User One'), (2,'user3@email.com','User Two'), (3,'user3email.com','User Three');
REPLACE INTO
User::replace($users);
-- produces this query REPLACE INTO `users`(`id`,`email`,`name`) VALUES (1,'user1@email.com','User One'), (2,'user3@email.com','User Two'), (3,'user3email.com','User Three');
created_at 和 updated_at 字段。
created_at 和 updated_at 将 不会 自动更新。要更新,可以在插入数组中传递字段。
['id' => 1, 'email' => 'user1@email.com', 'name' => 'User One', 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()]
运行单元测试
./vendor/bin/phpunit
这个在Postgresql上也能工作吗?
不。On Duplicate Key Update 只在MySQL上可用。Postgresql 9.4 有一个类似的功能,称为 UPSERT。实现 UPSERT 作为一个练习留给读者。
这和updateOrCreate()不是一样的吗?
它们很相似但并不相同。updateOrCreate() 只能一次处理一行,这不允许批量插入。InsertOnDuplicateKey 可以处理多行。