無論updateOrCreate()與upsert()做同樣的事情,插入或更新,我想他們都產生SQL INSERT INTO ON DUPLICATE KEY。所以我覺得提供唯一標識記錄的論據似乎沒有必要。
為什么他們需要“第二個引數列出唯一標識關聯表中記錄的列”。?
我能想到的原因可能在某些情況下他們不生成 sqlINSERT INTO ON DUPLICATE KEY所以他們可能需要引數來唯一標識記錄?但情況是這樣嗎?
uj5u.com熱心網友回復:
updateOrCreate 方法查找與作為第一個引數傳遞的約束匹配的記錄,如果找到該記錄,它將使用作為第二個引數傳遞的屬性更新匹配
如果沒有找到匹配的記錄,它將使用作為第一個引數傳遞的約束和作為第二個引數傳遞的屬性來創建記錄。
uj5u.com熱心網友回復:
我檢查了 Laravel 源,它證實了我的懷疑upsert(),請參閱https://github.com/illuminate/database/blob/master/Query/Grammars/MySqlGrammar.php#L164
它生成 sqlinsert on duplicate key update 但根本不使用 $uniqueBy 引數!(應該不會)
public function compileUpsert(Builder $query, array $values, array $uniqueBy, array $update)
{
$sql = $this->compileInsert($query, $values).' on duplicate key update ';
$columns = collect($update)->map(function ($value, $key) {
return is_numeric($key)
? $this->wrap($value).' = values('.$this->wrap($value).')'
: $this->wrap($key).' = '.$this->parameter($value);
})->implode(', ');
return $sql.$columns;
}
對于updateOrCreate()它實際上不產生insert on duplicate key update,但兩個SQL子句!
https://github.com/illuminate/database/blob/master/Eloquent/Builder.php#L469
public function updateOrCreate(array $attributes, array $values = [])
{
return tap($this->firstOrNew($attributes), function ($instance) use ($values) {
$instance->fill($values)->save();
});
}
這里不容易看到生成的sql子句,但是查看日志,是2個子句,一個insert into又一個update
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/372558.html
