我有用于向数据库添加数据数组的示例工作代码:
迁移:
Schema::create('words', function (Blueprint $table) {
$table->increments('id');
$table->string('word')->unique();
$table->integer('type')->default(0);
$table->integer('is_active')->default(0);
$table->timestamps();
});
代码:
$words = [
['word' => 'apple', 'type' => 1, 'is_active' => 1],
['word' => 'peach', 'type' => 1, 'is_active' => 1],
['word' => 'banana', 'type' => 1, 'is_active' => 1]
];
foreach ($words as $word) {
Word::updateOrCreate($word);
}
在我的数据库中,单词将是唯一的,对于唯一插入,我使用updateOrCreate()方法。在我的代码中有 3个查询到数据库。如何使用一个查询将唯一数据数组插入数据库?我见过updateOrInsert(),但是我也不能用一个查询将数据插入数据库。
答案 0 :(得分:1)
您无法开箱即用,因为Eloquent不支持INSERT IGNORE
或ON DUPLICATE KEY
构造。
您可能需要this package provides之类的内容。
这适用于您的用例,但我并不是它所使用的静态方法的忠实粉丝。
另请注意,这会产生MySQL查询并且(如使用DB::table('x')
)它不使用Eloquent,因此它不会在模型上设置/更新时间戳,也不会触发事件等
答案 1 :(得分:0)
您应该尝试以下代码。
DB::table('words')->insert([
['word' => 'apple', 'type' => 1, 'is_active' => 1],
['word' => 'peach', 'type' => 1, 'is_active' => 1],
['word' => 'banana', 'type' => 1, 'is_active' => 1],
]);
答案 2 :(得分:0)
您可以使用insert-on-duplicate使用一个原始数据库查询来执行此操作。
未经测试,但可能是这样的:
$sql = 'INSERT INTO words (word, type, is_active) VALUES ';
foreach($words as $row) {
$sql .= '('.$row['word'].','.$row['type'].','.$row['is_active'].') ';
}
$sql .= 'ON DUPLICATE KEY UPDATE word = VALUES(word)';
DB::statement($sql);
您也可能想要将时间戳放在那里。