sql >> Database >  >> RDS >> Mysql

CakePHP 3:Best Practice voor tijdelijke SQL-tabellen

Het is niet nodig om het niet te vertellen zoek de tabel, eigenlijk is dat het tegenovergestelde van wat je wilt doen, aangezien je er uiteindelijk toegang toe wilt hebben.

De tabelklasse moet in principe zoals gewoonlijk worden geconfigureerd en u moet de tijdelijke databasetabel maken voordat de toepassing ervoor zorgt dat deze wordt geopend. U kunt de onbewerkte SQL voor het maken van tabellen handmatig schrijven of deze genereren vanuit een \Cake\Database\Schema\TableSchema instantie, die tijdelijke tabellen ondersteunt.

U kunt het schema-object expliciet maken:

$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);

of laat het tabelobject het genereren, met behulp van uw velddefinitiematrix:

$TableObject->setSchema($TableObject->fields);
$schema = $TableObject->getSchema()->setTemporary(true);

U kunt dan de tabelaanmaak-SQL van het schemaobject genereren en uitvoeren op de database:

$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 zou een reeks SQL-opdrachten zijn die nodig zijn om de tabel te maken, iets in de trant van:

[
    'CREATE TEMPORARY TABLE `temp_items` (
        `id` INTEGER AUTO_INCREMENT,
        `con` VARCHAR(255) NOT NULL,
        PRIMARY KEY (`id`)
    )'
]

Houd er rekening mee dat als u het schema niet aan het tabelobject toewijst, u in de cache kunt komen te staan, omdat het in de cache opgeslagen schema niet meer overeenkomt wanneer u de tabeldefinitie wijzigt en de cache niet wist.

Zie ook




  1. FOUT:relatie plaatsen bestaat niet Heroku db import

  2. Tijdelijke PostgreSQL-tabellen

  3. Strings samenvoegen in SQL

  4. Records tussen 2 datums ophalen in MySQL