sql >> Databasteknik >  >> RDS >> Mysql

CakePHP 3:Bästa praxis för tillfälliga SQL-tabeller

Det finns ingen anledning att säga till den att inte leta efter tabellen, det är faktiskt motsatsen till vad du vill göra, med tanke på att du så småningom vill komma åt det.

Tabellklassen ska i princip konfigureras som vanligt, och du bör skapa den tillfälliga databastabellen innan applikationen gör att den nås. Du kan antingen skriva SQL för att skapa råtabeller manuellt eller generera den från en \Cake\Database\Schema\TableSchema instans, som stöder temporära tabeller.

Du kan antingen uttryckligen skapa schemaobjektet:

$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 låt tabellobjektet generera det med hjälp av din fields definition array:

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

Du kan sedan generera tabellskapande SQL från schemaobjektet och köra det mot 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 skulle vara en rad SQL-kommandon som krävs för att skapa tabellen, något i stil med:

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

Observera att om du inte tilldelar schemat till tabellobjektet kan du stöta på cachningsproblem, eftersom det cachade schemat inte skulle matcha längre när du ändrar tabelldefinitionen och inte rensar cachen.

Se även




  1. IS NOT NULL-testet för en post returnerar inte TRUE när variabeln är inställd

  2. uppföljning där datumklausul

  3. Parametrar filnamnet i MYSQL LOAD DATA INFILE

  4. Vilken är den bästa DBMS för jobbet?