Files
FACULTATE-KNOW_YOUR_FOOD/knowyourfood/core/Database.php
T

78 lines
2.4 KiB
PHP
Executable File

<?php
namespace app\core;
class Database{
public \PDO $pdo;
public function __construct(array $config){
$dsn = $config['dsn'] ?? '';
$user = $config['user'] ?? '';
$password = $config['password'] ?? '';
$this->pdo = new \PDO($dsn, $user, $password);
$this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
public function applyMigrations(){
$this->createMigrationsTable();
$appliedMigrations = $this->getAppliedMigrations();
$newMigrations = [];
$files = scandir(Application::$ROOT_DIR.'/migrations');
$toApplyMigrations = array_diff($files, $appliedMigrations);
foreach($toApplyMigrations as $migration){
if($migration === '.' || $migration === '..'){
continue;
}
require_once Application::$ROOT_DIR.'/migrations/'.$migration;
$className = pathinfo($migration, PATHINFO_FILENAME);
$instance = new $className();
$this->log("Applying migration $migration" . PHP_EOL);
$instance->up();
$this->log("Applied migration $migration" . PHP_EOL);
$newMigrations[] = $migration;
}
if(!empty($newMigrations)){
$this->saveMigrations($newMigrations);
}else{
$this->log('All migrations are applied');
}
}
public function createMigrationsTable(){
$this->pdo->exec("
CREATE TABLE IF NOT EXISTS migrations (
id INT AUTO_INCREMENT,
migration varchar(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
)
ENGINE=INNODB;");
}
public function getAppliedMigrations(){
$statement = $this->pdo->prepare("SELECT migration FROM migrations");
$statement->execute();
return $statement->fetchAll(\PDO::FETCH_COLUMN);
}
public function saveMigrations(array $migrations){
$str = implode(",", array_map(fn($m) => "('$m')", $migrations));
$statement = $this->pdo->prepare("INSERT INTO migrations (migration) VALUES $str");
$statement->execute();
}
public function prepare($sql){
return $this->pdo->prepare($sql);
}
protected function log($message){
echo '['.date('Y-m-d H:i:s').'] - '.$message.PHP_EOL;
}
}