我编写此函数用于插入数组中的单词:
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中的数据库中不重复的单词?
答案 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);
}