sql >> Database teknologi >  >> RDS >> Mysql

CakePHP 3:Bedste praksis for midlertidige SQL-tabeller

Der er ingen grund til at fortælle det til ikke kig efter bordet, faktisk er det det modsatte af, hvad du vil gøre, givet at du til sidst vil have adgang til det.

Tabelklassen skal grundlæggende være konfigureret som normalt, og du bør oprette den midlertidige databasetabel, før applikationen får den til at blive tilgået. Du kan enten skrive den rå tabel oprettelse SQL manuelt eller generere den fra en \Cake\Database\Schema\TableSchema instans, som understøtter midlertidige tabeller.

Du kan enten eksplicit oprette skemaobjektet:

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

eller lad tabelobjektet generere det ved at bruge dit feltdefinitionsarray:

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

Du kan derefter generere tabeloprettelse SQL fra skemaobjektet og køre det mod databasen:

$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 ville være en række SQL-kommandoer, der kræves for at oprette tabellen, noget i stil med:

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

Bemærk, at hvis du ikke tildeler skemaet til tabelobjektet, kan du løbe ind i cacheproblemer, da det cachelagrede skema ikke ville matche længere, når du ændrer tabeldefinitionen og ikke rydder cachen.

Se også




  1. ENUM (Enumeration) Datatype i MySQL:Top 12 fakta og nyttige tips

  2. MYSQL - datetime til sekunder

  3. Hvordan kortlægger jeg en BigDecimal i Hibernate, så jeg får den samme skala tilbage, som jeg har lagt ind?

  4. Skift tabel eller nulstil automatisk stigning ved hjælp af CDbMigration