66 lines
1.6 KiB
PHP
66 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Database;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class UpdateMassive5
|
|
{
|
|
|
|
/**
|
|
*
|
|
* 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;
|
|
*
|
|
* @param string $table
|
|
* @param string $primaryKeyName
|
|
* @param $config
|
|
*
|
|
* Config:
|
|
* [
|
|
* [
|
|
* "primary_key" => 200576
|
|
* "columns" => array:1 [
|
|
* "coupon_code" => "2001462387"
|
|
* ]
|
|
* ]
|
|
* ]
|
|
*
|
|
* @return void
|
|
*/
|
|
public function apply(string $table, string $primaryKeyName, array $config): void
|
|
{
|
|
$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);
|
|
}
|
|
}
|