Метод updateOrInsert
Метод updateOrInsert применяется к запросу Query Builder
и используется для вставки записи в базу данных, либо для обновления
существующей записи, если она уже присутствует. Первым параметром
передаётся массив условий для поиска записи, вторым - массив данных
для обновления или вставки. Если запись найдена, она обновляется
переданными данными, если нет - создаётся новая запись, объединяя
условия поиска и данные для вставки.
Синтаксис
<?php
DB::table($table)->updateOrInsert($searchConditions, $data);
?>
Пример
Давайте обновим или вставим запись в таблице 'users'.
Если пользователь с 'email' равным 'user@example.com'
существует, обновим его 'name' и 'age', если нет -
создадим нового пользователя:
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('users')->updateOrInsert(
['email' => 'user@example.com'],
['name' => 'John Doe', 'age' => 30]
);
echo $res;
?>
Результат выполнения кода:
"true"
Пример
Давайте обновим или вставим запись, используя несколько условий
для поиска. Если существует запись с 'email' равным
'admin@site.com' и 'role' равным 'admin',
обновим её 'status' на 'active', иначе создадим
новую запись:
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('users')->updateOrInsert(
['email' => 'admin@site.com', 'role' => 'admin'],
['status' => 'active']
);
echo $res;
?>
Результат выполнения кода:
"true"
Пример
Давайте обновим или вставим запись, а затем проверим,
была ли она вставлена или обновлена. Для этого используем
метод exists для проверки существования записи
перед вызовом updateOrInsert:
<?php
use Illuminate\Support\Facades\DB;
$email = 'test@test.com';
if (DB::table('users')->where('email', $email)->exists()) {
echo 'Record updated';
} else {
echo 'Record inserted';
}
$res = DB::table('users')->updateOrInsert(
['email' => $email],
['name' => 'Test User', 'age' => 25]
);
?>
Результат выполнения кода:
"Record inserted"
Пример
Давайте используем updateOrInsert с более сложными
данными для вставки, включая временную метку 'updated_at':
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Date;
$res = DB::table('users')->updateOrInsert(
['email' => 'john@example.com'],
[
'name' => 'John Smith',
'age' => 28,
'updated_at' => Date::now()
]
);
echo $res;
?>
Результат выполнения кода:
"true"
Пример
Давайте обновим или вставим запись в таблице 'products',
используя 'sku' (артикул) в качестве уникального ключа
для поиска:
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('products')->updateOrInsert(
['sku' => 'ABC-123'],
[
'name' => 'Laptop',
'price' => 999.99,
'quantity' => 10
]
);
echo $res;
?>
Результат выполнения кода:
"true"
Смотрите также
-
метод
updateOrCreate,
который выполняет аналогичную операцию для Eloquent-моделей -
метод
upsert,
который выполняет массовую вставку с обновлением записей -
метод
firstOrCreate,
который находит запись или создаёт новую -
метод
insert,
который вставляет новые записи в таблицу