public function up(array $table_names = [], $engine = null, $onerror = null)
{
$creator = function (Blueprint $table, $table_name, $definition, $uniques) use($engine) {
if ($engine) {
$table->engine = $engine;
}
foreach ($definition->fields as $name => $field) {
if ($name === 'timestamps') {
$table->timestamps();
} elseif ($name === 'soft-deletes') {
$table->softDeletes();
} else {
$this->field($table, $name, $field);
if (isset($field->foreign)) {
$this->foreigns[$table_name][$name] = $field->foreign;
}
}
}
foreach ($uniques as $unique) {
$table->unique($unique);
}
};
$creator->bindTo($this);
if (!$table_names) {
$table_names = $this->loader->names();
}
$tables = [];
foreach ($table_names as $name) {
$definition = $this->loader->get($name);
if (!$definition) {
$msg = "table definition for '{$name}' doesn't exist.";
if ($onerror) {
$onerror($msg);
} else {
throw new \Exception($msg);
}
continue;
}
$tables[$name] = $definition;
$builder = $this->db->getSchemaBuilder();
$this->foreigns[$name] = [];
if (isset($definition->foreign)) {
$this->foreigns[$name] = (array) $definition->foreign;
}
$uniques = [];
if (isset($definition->unique)) {
$uniques = (array) $definition->unique;
}
$builder->setConnection($this->db);
$builder->create($name, function (Blueprint $table) use($creator, $name, $definition, $uniques) {
$creator($table, $name, $definition, $uniques);
});
}
$table = $this->app['config']['jables.table'];
$this->db->table($table)->insert(['type' => 'table', 'data' => json_encode($tables)]);
}