++ fix e controlli
This commit is contained in:
@@ -3,23 +3,45 @@
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
/**
|
||||
* La conversione si fa in PHP e non in SQL.
|
||||
*
|
||||
* La versione originale usava GREATEST(1, CEIL(h / 720)), che e' sintassi
|
||||
* MySQL: SQLite non conosce GREATEST e la migrazione moriva con "no such
|
||||
* function", rendendo impossibile costruire lo schema per la suite di test
|
||||
* (che gira su SQLite in memoria — vedi phpunit.xml).
|
||||
*
|
||||
* Il risultato e' identico a quello dell'espressione SQL, e la migrazione e'
|
||||
* gia' applicata ovunque, quindi la riscrittura non tocca nessun database
|
||||
* esistente: vale solo per le installazioni nuove e per i test. `settings`
|
||||
* contiene una riga sola, quindi il giro in PHP non costa niente.
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
private const ORE_PER_MESE = 720;
|
||||
|
||||
public function up(): void
|
||||
{
|
||||
DB::table('settings')
|
||||
->whereNotNull('assignment_link_ttl_hours')
|
||||
->update([
|
||||
'assignment_link_ttl_hours' => DB::raw('GREATEST(1, CEIL(assignment_link_ttl_hours / 720))'),
|
||||
]);
|
||||
$this->converti(fn (int $ore) => max(1, (int) ceil($ore / self::ORE_PER_MESE)));
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
DB::table('settings')
|
||||
->whereNotNull('assignment_link_ttl_hours')
|
||||
->update([
|
||||
'assignment_link_ttl_hours' => DB::raw('assignment_link_ttl_hours * 720'),
|
||||
]);
|
||||
$this->converti(fn (int $mesi) => $mesi * self::ORE_PER_MESE);
|
||||
}
|
||||
};
|
||||
|
||||
private function converti(callable $conversione): void
|
||||
{
|
||||
$righe = DB::table('settings')
|
||||
->whereNotNull('assignment_link_ttl_hours')
|
||||
->get(['id', 'assignment_link_ttl_hours']);
|
||||
|
||||
foreach ($righe as $riga) {
|
||||
DB::table('settings')
|
||||
->where('id', $riga->id)
|
||||
->update([
|
||||
'assignment_link_ttl_hours' => $conversione((int) $riga->assignment_link_ttl_hours),
|
||||
]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user