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 (количество затронутых строк)
PHP

Обновление с использованием выражений

Для обновления с использованием функций базы данных или арифметических операций используйте 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()')
    ]);
PHP

Обновление с использованием 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'
    ]);
PHP

Вставка или обновление (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] // Данные для обновления
);
PHP

Важно: Колонка, указанная как уникальная, должна присутствовать в массиве с данными для вставки.

Обновление с условиями

Как и при выборке, перед обновлением вы можете применять любые условия:

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]);
PHP