200576 * "columns" => array:1 [ * "transactions_banks.coupon_code" => "2001462387" * ] * ] * ] * * @return void */ public function apply(string $table, string $primaryKeyName, array $config): void { /** * update test as t set * column_a = c.column_a, * column_c = c.column_c * from (values * ('123', 1, '---'), * ('345', 2, '+++') * ) as c(column_b, column_a, column_c) * where c.column_b = t.column_b; * * * update transactions as t * set date = c.date, * value = c.value * from ( * values (1, '2023-01-05 00:00:00'::timestamp, 23.44), * (2, '2023-01-03 00:00:00'::timestamp, 23.44) * ) as c(id, date, value) * where t.id = c.id; * */ $valuesSqls = []; $columns = $config[0]['columns']; foreach ($config as $configItem) { $valuesSqls[] = vsprintf('(%s, %s)', [$configItem['primary_key'], implode(', ', $configItem['columns'])]); } $valuesSql = implode(', ', $valuesSqls); $setSqls = []; foreach ($columns as $columnName => $columnValue) { $setSqls[] = vsprintf('%s = a2.%s', [$columnName, $columnName]); } $setSql = implode(', ', $setSqls); $sql = vsprintf('update %s as a1 set %s from (values %s) as a2(%s, date, value) where a1.%s = a2.%s', [ $table, $setSql, $valuesSql, $primaryKeyName, $primaryKeyName, $primaryKeyName, ]); DB::statement($sql); } }