OpenXE/classes/Components/SchemaCreator/docs/schema-creator.md

136 lines
5.3 KiB
Markdown
Raw Normal View History

2021-05-21 08:49:41 +02:00
# Synopsis
* Create defined Table Schema if it does not exist
* Ensure that existing table, and the target schema are the same
# Usage
Example:
```php
use Xentral\Components\SchemaCreator\Option\TableOption;
use Xentral\Components\SchemaCreator\SchemaCreator;
use Xentral\Components\SchemaCreator\Schema\TableSchema;
use Xentral\Components\SchemaCreator\Type;
/** @var SchemaCreator $tableCreator */
$tableCreator = $this->app->Container->get('SchemaCreator');
$fooTable = new TableSchema('foo_table');
$fooTable->addColumn(Type\Integer::asAutoIncrement('id'));
$fooTable->addColumn(Type\Integer::asUnsigned('user_id'));
$fooTable->addColumn(new Type\Varchar('name'));
$fooTable->addColumn(new Type\Varchar('language', 5));
$fooTable->addColumn(new Type\Varchar('first_name', 100));
$fooTable->addColumn(new Type\Varchar('last_name', 200, '', false));
$fooTable->addColumn(new Type\Tinyint('active',1,false));
$fooTable->addColumn(new Type\Time('timed_at','00:00:00'));
$fooTable->addColumn(new Type\Year('year_example'));
$fooTable->addOption(TableOption::fromEngine('InnoDB'));
$fooTable->addOption(TableOption::fromCharset('utf8'));
$fooTable->addOption(TableOption::fromComment('This is a comment'));
$fooTable->addOption(TableOption::fromCollation('utf8_unicode_ci'));
$tableCreator->ensureSchema($fooTable);
// display table's structure
var_export($tableCreator->getSqlSchema($fooTable));
```
Example with Index
```php
use Xentral\Components\SchemaCreator\SchemaCreator;
use Xentral\Components\SchemaCreator\Schema\TableSchema;
use Xentral\Components\SchemaCreator\Type;
use Xentral\Components\SchemaCreator\Index;
/** @var SchemaCreator $tableCreator */
$tableCreator = $this->app->Container->get('SchemaCreator');
$barTable = new TableSchema('bar_table');
$barTable->addColumn(new Type\Integer('id',10, true,null,false, ['extra' => 'ai']));
$barTable->addColumn(new Type\Integer('foo_table_id',10, true));
$barTable->addColumn(new Type\Varchar('langue'));
$barTable->addColumn(new Type\Varchar('prenom'));
$barTable->addColumn(new Type\Varchar('nom_de_famille'));
$barTable->addColumn(new Type\Tinyint('actif', 1));
$barTable->addIndex(new Index\Primary(['id']));
$barTable->addIndex(new Index\Unique(['prenom'], 'unique_first_name'));
$barTable->addIndex(new Index\Unique(['langue', 'actif']));
$barTable->addIndex(new Index\Index(['nom_de_famille'], 'custom_name'));
$tableCreator->ensureSchema($barTable);
```
Generate Schema from existing table
```php
use Xentral\Components\SchemaCreator\SchemaCreator;
/** @var SchemaCreator $tableCreator */
$tableCreator = $this->app->Container->get('SchemaCreator');
$currentSchema = $tableCreator->createFromExistingTable('foo_table');
// get table's definition
$tableDefinition = $tableCreator->getSqlSchema($currentSchema);
var_export($tableDefinition);
```
# Defines Table Schema in your module
```php
declare(strict_types=1);
namespace Xentral\Modules\Foo;
use Xentral\Components\SchemaCreator\Collection\SchemaCollection;
use Xentral\Components\SchemaCreator\Schema\TableSchema;
use Xentral\Components\SchemaCreator\Type;
use Xentral\Components\SchemaCreator\Index;
use Xentral\Components\SchemaCreator\Option\TableOption;
final class Bootstrap
{
/**
* @param SchemaCollection $collection
*
* @return void
*/
public static function registerTableSchemas(SchemaCollection $collection): void
{
$fooTable = new TableSchema('foo_table');
$fooTable->addColumn(Type\Integer::asAutoIncrement('id'));
$fooTable->addColumn(Type\Integer::asUnsigned('user_id'));
$fooTable->addColumn(new Type\Varchar('name'));
$fooTable->addColumn(new Type\Varchar('language', 5));
$fooTable->addColumn(new Type\Varchar('first_name', 100));
$fooTable->addColumn(new Type\Varchar('last_name', 200, '', false));
$fooTable->addColumn(new Type\Tinyint('active',1,false));
$fooTable->addColumn(new Type\Time('timed_at',null, false));
$fooTable->addColumn(new Type\Year('year_example'));
$fooTable->addOption(TableOption::fromEngine('InnoDB'));
$fooTable->addOption(TableOption::fromCharset('utf8'));
$fooTable->addOption(TableOption::fromComment('This is a comment'));
$fooTable->addOption(TableOption::fromCollation('utf8_unicode_ci'));
$barTable = new TableSchema('bar_table');
$barTable->addColumn(new Type\Integer('id',10, true,null,false, ['extra' => 'ai']));
$barTable->addColumn(new Type\Integer('foo_table_id',10, true));
$barTable->addColumn(new Type\Varchar('langue'));
$barTable->addColumn(new Type\Varchar('prenom'));
$barTable->addColumn(new Type\Varchar('nom_de_famille'));
$barTable->addColumn(new Type\Tinyint('actif', 1));
$barTable->addIndex(new Index\Primary(['id']));
$barTable->addIndex(new Index\Unique(['prenom'], 'unique_first_name'));
$barTable->addIndex(new Index\Unique(['langue', 'actif']));
$barTable->addIndex(new Index\Index(['nom_de_famille'], 'custom_name'));
// ADD TableSchema
$collection->add($fooTable);
$collection->add($barTable);
}
# ...
}
```