Files
2026-08-08 18:27:38 +08:00

54 lines
1.7 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\View\View;
/**
* 后台数据库管理:查看迁移状态(已执行 / 待执行),并可一键执行迁移升级。
* 满足「数据库可以随时在后台升级」——代码上线后无需 SSH,点按钮即可 migrate。
*/
class DatabaseController extends Controller
{
public function index(): View
{
$connection = config('database.default');
$dbName = config("database.connections.{$connection}.database");
$ran = [];
if (Schema::hasTable('migrations')) {
$ran = DB::table('migrations')->pluck('migration')->toArray();
}
$files = glob(database_path('migrations/*.php'));
$all = array_map(fn ($f) => basename($f, '.php'), $files);
sort($all);
$done = array_values(array_intersect($all, $ran));
$pending = array_values(array_diff($all, $ran));
return view('admin.database', compact('connection', 'dbName', 'pending', 'done'));
}
public function upgrade(Request $request): RedirectResponse
{
try {
Artisan::call('migrate', ['--force' => true]);
$output = Artisan::output();
return redirect()->route('admin.database')
->with('success', '数据库升级已执行完成。')
->with('migrate_output', $output);
} catch (\Throwable $e) {
return redirect()->route('admin.database')
->with('error', '升级失败:' . $e->getMessage());
}
}
}