Query Builder: UPDATE
Для изменения существующих записей в базе используется метод update. Он принимает ассоциативный массив, где ключи — названия колонок, а значения — новые данные. Метод возвращает количество обновленных строк.
Все значения автоматически экранируются, кроме Expression.
use Imhotep\Facades\DB;
$updated = DB::table('users')
->where('id', 1)
->update([
'name' => 'Ivan Petrov',
'age' => 30,
'updated_at' => date('Y-m-d H:i:s')
]);
// $updated = 1 (количество затронутых строк)
Обновление с использованием выражений
Для обновления с использованием функций базы данных или арифметических операций используйте Expression или DB::raw:
use Imhotep\Facades\DB;
use Imhotep\Database\Expression;
DB::table('products')
->where('id', 5)
->update([
'price' => new Expression('price * 1.1'), // Увеличить цену на 10%
'quantity' => DB::raw('quantity - 1'), // Уменьшить количество на 1
'updated_at' => new Expression('NOW()')
]);
Обновление с использованием JOIN
Метод update в комбинации с join позволяет обновлять записи в основной таблице, применяя условия фильтрации из связанных таблиц.
use Imhotep\Facades\DB;
DB::table('users')
->join('profiles', 'users.id', '=', 'profiles.user_id')
->where('profiles.city', 'Moscow')
->update([
'users.status' => 'active'
]);
Вставка или обновление (UPSERT)
Метод upsert позволяет либо вставить новую запись, либо обновить существующую, если запись с указанным уникальным ключом уже существует:
use Imhotep\Facades\DB;
$affected = DB::table('users')->upsert(
'email', // Уникальная колонка для поиска
['email' => 'john@example.com', 'name' => 'John Doe', 'age' => 25], // Данные для вставки
['name' => 'John Updated', 'age' => 26] // Данные для обновления
);
Важно: Колонка, указанная как уникальная, должна присутствовать в массиве с данными для вставки.
Обновление с условиями
Как и при выборке, перед обновлением вы можете применять любые условия:
use Imhotep\Facades\DB;
// Обновить всех активных пользователей старше 25 лет
$updated = DB::table('users')
->where('active', true)
->where('age', '>', 25)
->update(['status' => 'verified']);
// Обновить с использованием вложенных условий
$updated = DB::table('users')
->where(function ($query) {
$query->where('age', '<', 18)
->orWhere('age', '>', 65);
})
->update(['discount' => 10]);