Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

CakePHP 3:Melhor prática para tabelas SQL temporárias


Não há necessidade de dizer para não procure a tabela, na verdade isso é o oposto do que você quer fazer, já que eventualmente você quer acessá-la.

A classe de tabela deve basicamente ser configurada como de costume, e você deve criar a tabela de banco de dados temporária antes que o aplicativo faça com que ela seja acessada. Você pode escrever o SQL de criação de tabela bruta manualmente ou gerá-lo de um \Cake\Database\Schema\TableSchema instância, que suporta tabelas temporárias.

Você pode criar explicitamente o objeto de esquema:
$schema = new \Cake\Database\Schema\TableSchema('temp_items');
$schema
    ->addColumn('id', ['type' => 'integer'])
    ->addColumn('con', ['type' => 'string', 'length' => 255, 'null' => false])
    ->addConstraint('primary', ['type' => 'primary', 'columns' => ['id']])
    ->setTemporary(true);

$TableObject->setSchema($schema);

ou deixe o objeto de tabela gerá-lo, usando sua matriz de definição de campos:
$TableObject->setSchema($TableObject->fields);
$schema = $TableObject->getSchema()->setTemporary(true);

Você pode então gerar o SQL de criação de tabela a partir do objeto de esquema e executá-lo no banco de dados:
$connection = $TableObject->getConnection();
$queries = $schema->createSql($connection);

$connection->transactional(
    function (\Cake\Database\Connection $connection) use ($queries) {
        foreach ($queries as $query) {
            $stmt = $connection->execute($query);
            $stmt->closeCursor();
        }
    }
);

$queries seria uma matriz de comandos SQL necessários para criar a tabela, algo nos moldes de:
[
    'CREATE TEMPORARY TABLE `temp_items` (
        `id` INTEGER AUTO_INCREMENT,
        `con` VARCHAR(255) NOT NULL,
        PRIMARY KEY (`id`)
    )'
]

Observe que, se você não atribuir o esquema ao objeto de tabela, poderá ter problemas de cache, pois o esquema em cache não corresponderá mais quando você alterar a definição da tabela e não limpar o cache.

Veja também