У меня есть ограничение MySQL для обеспечения уникальности составного ключа. При вставке новой записи в мою модель Foo
я получаю ожидаемую ошибку:
$foo = new Foo(['foo' => 42, 'bar => 1]);
$foo->save();
Ошибка:
SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись '42' для ключа 'Уникальный' ...
Одним из способов избежать этой ошибки является запрос модели перед вставкой:
if (!Foo::where('foo', 42)->where('bar', 1)->first()) {
$foo = new Foo(['foo' => 42, 'bar => 1]);
$foo->save();
}
Еще один вариант - перехватить исключение, когда preg_match(/UNIQUE/, $e->message)
равно true
.
Есть ли лучшее решение?
EDIT
Я заметил, что в Illuminate\Database\Eloquent\Builder
Laravel все равно выполняет двойной запрос, что немного грустно:
public function findOrNew($id, $columns = ['*'])
{
if (! is_null($model = $this->find($id, $columns))) {
return $model;
}
return $this->newModelInstance();
}