我如何纠正我的功能 - Laravel-5.5?

时间:2017-10-17 17:24:57

标签: php laravel laravel-5.5

我编写此函数用于插入数组中的单词:

public function ins($array)
{
    foreach ($array as $key => $value) {
        DB::table('words')->updateOrInsert(['word' => $value]);
    }

}

我使用此查询在mysql中为重复值创建了索引:

CREATE UNIQUE INDEX `idx_word` ON `db`.`words` (word);

但是当我使用我的函数添加单词时,会出现这个错误:

"SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where (`word` = ?) limit 1' at line 1 (SQL: update `words` set  where (`word` = microsoft) limit 1) ◀"

如何正确地将我的函数添加到Laravel 5.5中的数据库中不重复的单词?

3 个答案:

答案 0 :(得分:5)

这是updateOrInsert的方法签名:

bool updateOrInsert(array $attributes, array $values = [])

如果行属性已经存在(在您的情况下,如果该单词已经存在),它将根据传递给第二个参数的内容进行更新。

要解决您的问题,您只需重复属性参数即可填充values参数:

DB::transaction(function () use ($value) {
    DB::table('words')->updateOrInsert(['word' => $value], ['word' => $value]);
});

答案 1 :(得分:2)

我认为你应该使用Model而不是Query builder,即DB :: table。

Word.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Word extends Model
{
    protected $table = "words";
}

Word 模型上使用 updateOrCreate

Word::updateOrCreate(['word' => $value]);

注意:没有经过测试,给你一个大纲。

答案 2 :(得分:1)

你可以这样做:

public function ins($array)
{
    $wordsNotExists = array();
    $wordsToInsert = array();

    $array = array_unique($array);
    $wordsThatExists = DB::table('words')
            ->whereIn('word', $array)
            ->pluck('word');

     $wordsNotExists = array_diff ($array, $wordsThatExists->toArray());

    foreach ($wordsNotExists as $key => $value) {
        $wordsToInsert[] = ['word' => $value];
    }

    DB::table('words')->insert($wordsToInsert);
}

创建索引后,您可以使用Raw方法插入数据:

foreach (array_unique($array) as $key => $value) {
    DB::insert('INSERT INTO words VALUES (?) ON DUPLICATE KEY word = VALUES(word)', $value);
}