如何将一个查询的数组数据插入到数据库的唯一字段?

时间:2018-04-02 05:42:35

标签: php laravel performance insert-update laravel-5.6

我有用于向数据库添加数据数组的示例工作代码:

迁移:

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(),但是我也不能用一个查询将数据插入数据库。

3 个答案:

答案 0 :(得分:1)

您无法开箱即用,因为Eloquent不支持INSERT IGNOREON 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);

您也可能想要将时间戳放在那里。