access-layer

#CreateTable

use Formal\AccessLayer\{
    Query\CreateTable,
    Table\Name,
    Table\Column,
};

$create = CreateTable::named(
    new Name('users'),
    new Column(
        new Column\Name('username'),
        Column\Type::varchar(),
    ),
    new Column(
        new Column\Name('name'),
        Column\Type::varchar(),
    ),
);
$connection($create);

This query will fail if the table does exist, you can prevent this like so:

use Formal\AccessLayer\{
    Query\CreateTable,
    Table\Name,
    Table\Column,
};

$create = CreateTable::ifNotExists(
    new Name('users'),
    new Column(
        new Column\Name('username'),
        Column\Type::varchar(),
    ),
    new Column(
        new Column\Name('name'),
        Column\Type::varchar(),
    ),
);
$connection($create);

#Constraints

#Primary key

You can specify the primary key of the table like so:

$create = CreateTable::named(
    new Name('users'),
    new Column(
        new Column\Name('id'),
        Column\Type::int(),
    ),
);
$create = $create->primaryKey(new Column\Name('id'));
$connection($create);

#Foreign key

$create = CreateTable::named(
    new Name('address'),
    new Column(
        new Column\Name('user'),
        Column\Type::int(),
    ),
    new Column(
        new Column\Name('address'),
        Column\Type::text(),
    ),
);
$create = $create->foreignKey(
    new Column\Name('user'),
    new Name('users'),
    new Column\Name('id'),
);
$connection($create);

[!NOTE] this will name the foreign key FK_user_id so it's easier to reference it afterwards.