1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
<?php
namespace Core\CLI;
use Core;
use Core\Modules\DB\Query;
final class DB
{
public static $migrations = array();
public static function __callStatic($name, array $arguments)
{
list($class, $command) = explode(':', $name);
call_user_func_array(array('Core\CLI\DB\\' . $class, $command), $arguments);
}
public static function create()
{
$query = new Query();
$query->createTable('migrations')->columns(array(
'version' => array(
'type' => 'string',
'length' => '10',
'not_null' => true,
),
))->tableEngine('MyISAM')->run();
}
public static function migrate($version = null)
{
$query = new Query();
$executed_migrations = Core\Utils::arrayFlatten($query->select('*')->from('migrations')->all());
$migrations_to_execute = array();
$dir = 'up';
if ($version) {
preg_match('/[0-9]{10}$/', $version, $matches);
if ($execute_to = $matches[0]) {
$migrations_to_execute = $query
->select('*')
->from('migrations')
->where('version > ?', array($execute_to))->order('version', 'desc')->all();
if (count($migrations_to_execute) == 0) {
$migrations_to_execute = array_filter(
self::$migrations,
function ($item) use ($executed_migrations, $execute_to) {
return !in_array($item['version'], $executed_migrations) && $item['version'] <= $execute_to;
}
);
} else {
$dir = 'down';
}
}
} else {
$migrations_to_execute = array_reverse(array_filter(
self::$migrations,
function ($item) use ($executed_migrations) {
return !in_array($item['version'], $executed_migrations);
}
));
}
foreach ($migrations_to_execute as $item) {
DB\Migrate::$dir($item['version']);
}
}
public static function rollback($step = 1)
{
$query = new Query();
$migrations_to_execute = $query->select('*')->from('migrations')->order('version', 'desc')->limit($step)->all();
foreach ($migrations_to_execute as $item) {
DB\Migrate::down($item['version']);
}
}
}