2023-01-12 10:42:37 +08:00

322 lines
9.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2021 https://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/JaguarJack/catchadmin-laravel/blob/master/LICENSE.md )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
declare(strict_types=1);
namespace Modules\Develop\Support\Generate\Create;
use Catch\CatchAdmin;
use Exception;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Schema as MigrationSchema;
/**
* schema
*/
class Schema extends Creator
{
/**
* @var bool
*/
protected bool $createdAt = true;
/**
* @var bool
*/
protected bool $updatedAt = true;
/**
* @var bool
*/
protected bool $deletedAt = true;
/**
* @var bool
*/
protected bool $creatorId = true;
/**
* @var array
*/
protected array $structures = [];
/**
* @param string $table
* @param string $engine
* @param string $charset
* @param string $collection
* @param string $comment
*/
public function __construct(
public readonly string $table,
public readonly string $engine,
public readonly string $charset,
public readonly string $collection,
public readonly string $comment
) {
}
/**
* create
*
* @return string|bool
* @throws Exception
*/
public function create(): string|bool
{
if (! count($this->structures)) {
return false;
}
if (MigrationSchema::hasTable($this->table)) {
throw new Exception(sprintf('[%s] 表已经存在', $this->table));
}
try {
$this->createTable();
if (MigrationSchema::hasTable($this->table)) {
return parent::create();
}
return false;
} catch (Exception $e) {
MigrationSchema::dropIfExists($this->table);
throw new Exception("由于{$e->getMessage()}, 表[{$this->table}]创建失败");
}
}
/**
* get file
*
* @return string
*/
public function getFile(): string
{
// TODO: Implement getFile() method.
return CatchAdmin::getModuleMigrationPath($this->module).date('Y_m_d_his_').'create_'.$this->table.'.php';
}
/**
* create table
*
* @throws Exception
*/
protected function createTable(): void
{
MigrationSchema::create($this->table, function (Blueprint $table) {
foreach ($this->structures as $structure) {
// if field && type hava value
if ($structure['type'] && $structure['field']) {
if ($structure['type'] == 'string') {
$column = $table->string($structure['field'], $structure['length'] ?: 255);
} elseif ($structure['type'] == 'char') {
$column = $table->char($structure['field'], $structure['length']);
} else {
$column = $table->{$structure['type']}($structure['field']);
}
$column = $column->nullable($structure['nullable']);
if (is_null($structure['default'])) {
} else {
if (is_numeric($structure['default']) || mb_strlen($structure['default'])) {
$column = $column->default($structure['default']);
}
}
if ($structure['comment']) {
$column = $column->comment($structure['comment']);
}
if ($structure['unique']) {
$column->unique($structure['unique']);
}
}
}
if ($this->creatorId) {
$table->creatorId();
}
if ($this->createdAt) {
$table->createdAt();
}
if ($this->updatedAt) {
$table->updatedAt();
}
if ($this->deletedAt) {
$table->deletedAt();
}
$table->charset = $this->charset;
$table->engine = $this->engine;
$table->collation = $this->collection;
$table->comment($this->comment);
});
}
/**
* get migration content
*
* @return string
*/
public function getContent(): string
{
$stub = File::get($this->getStub());
return Str::of($stub)->replace(['{method}','{table}', '{content}'], ['create', $this->table, $this->getMigrationContent()])->toString();
}
/**
* get content
*
* @return string
*/
public function getMigrationContent(): string
{
$content = Str::of('');
foreach ($this->structures as $structure) {
$begin = Str::of('$table->');
$type = Str::of($structure['type']);
if ($type->exactly('string')) {
$begin = $begin->append(sprintf("string('%s'%s)", $structure['field'], $structure['length'] ? ", {$structure['length']}" : ''));
} elseif ($type->exactly('char')) {
$begin = $begin->append(sprintf("char('%s', %s)", $structure['field'], $structure['length']));
} elseif ($type->exactly('id')) {
$begin = $begin->append(Str::of($structure['field'])->exactly('id') ? 'id()' : sprintf("id('%s')", $structure['field']));
} else {
$begin = $begin->append(sprintf("%s('%s')", $structure['type'], $structure['field']));
}
$content = $content->append($begin)
->when($structure['nullable'], function ($str) {
return $str->append('->nullable()');
})
->when(isset($structure['default']), function ($str, $default) {
if (is_numeric($default)) {
$default = intval($default);
return $str->append("->default({$default})");
}
if ($default) {
return $str->append("->default('{$default}')");
}
return $str;
})
->when($structure['unique'], function ($str) {
return $str->append("->unique()");
})
->when($structure['comment'], function ($str, $comment) {
return $str->append("->comment('{$comment}')");
})
->append(';')
->newLine();
}
if ($this->creatorId) {
$content = $content->append(Str::of('$table->')->append('creatorId();'))->newLine();
}
if ($this->createdAt) {
$content = $content->append(Str::of('$table->')->append('createdAt();'))->newLine();
}
if ($this->updatedAt) {
$content = $content->append(Str::of('$table->')->append('updatedAt();'))->newLine();
}
if ($this->deletedAt) {
$content = $content->append(Str::of('$table->')->append('deletedAt();'))->newLine();
}
return $content->newLine()
->append("\$table->engine='{$this->engine}'")
->append(';')
->newLine()
->append("\$table->comment('{$this->comment}')")
->append(';')
->toString();
}
/**
* @param bool $createdAt
* @return $this
*/
public function setCreatedAt(bool $createdAt): static
{
$this->createdAt = $createdAt;
return $this;
}
/**
* @param bool $updatedAt
* @return $this
*/
public function setUpdatedAt(bool $updatedAt): static
{
$this->updatedAt = $updatedAt;
return $this;
}
/**
* @param bool $deletedAt
* @return $this
*/
public function setDeletedAt(bool $deletedAt): static
{
$this->deletedAt = $deletedAt;
return $this;
}
/**
* @param bool $creatorId
* @return $this
*/
public function setCreatorId(bool $creatorId): static
{
$this->creatorId = $creatorId;
return $this;
}
/**
* @param array $structures
* @return $this
*/
public function setStructures(array $structures): static
{
$this->structures = $structures;
return $this;
}
/**
* get stub
*
* @return string
*/
protected function getStub(): string
{
return dirname(__DIR__).DIRECTORY_SEPARATOR.'stubs'.DIRECTORY_SEPARATOR.'migration.stub';
}
}