Вы можете использовать метод updateOrCreate () для достижения цели только вставки, если запись не существует:
$estate = Estates::updateOrCreate(['link' => $outlineUrl], $changeForMyDB);
Это проверит, существует ли Estate::where('link', '=', $outlineUrl)
.Если ничего не найдено, будет создан новый Estate´ and add all data from
$ changeForMyDB to it. If one exists, it will fetch it from the database, add all data from
$ changeForMyDB`.Тогда будут сохраняться изменения.Подробнее об этом читайте здесь: https://laravel.com/docs/5.7/eloquent#other-creation-methods
Чтобы избежать проблем с параллельными запросами, вы также должны заключить свое обновление в транзакцию базы данных.Это гарантирует, что при проверке уникальности база данных будет в том же состоянии, что и при сохранении ваших данных.
DB::transaction(function () {
$estate = Estates::updateOrCreate(['link' => $outlineUrl], $changeForMyDB);
});
Если вы не хотите обновлять существующие записи, используйте что-то вроде этого:
DB::transaction(function () {
if (Estates::where('link','=',$outlineUrl)->count() === 0) {
$estate = Estates::create($changeForMyDB);
}
});
Помните, что Estates::create($data)
и Estates::insert($data)
не совпадают.Функция create($data)
создаст модель, заполнит ее $data
и вернет сохраненную модель.Он также запустит все события Eloquent, относящиеся к методу create.С другой стороны, метод insert($data)
не будет создавать модель Eloquent и, следовательно, не будет запускать любые события Eloquent.Он будет напрямую вставлять данные в базу данных.Это проще и быстрее, но вы должны помнить об этом.
Если вы хотите проверить, существует ли уже запись, и сообщить об ошибке какого-либо типа, вы можете проверить это:
if (!$estate->wasRecentlyCreated()) {
// report error here
}