Mysql
 sql >> Datenbank >  >> RDS >> Mysql

CakePHP 3:Best Practice für temporäre SQL-Tabellen

Es ist nicht nötig, es nicht zu sagen Suchen Sie nach der Tabelle, eigentlich ist das das Gegenteil von dem, was Sie tun möchten, da Sie schließlich darauf zugreifen möchten.

Die Tabellenklasse sollte grundsätzlich wie gewohnt konfiguriert werden, und Sie sollten die temporäre Datenbanktabelle erstellen, bevor die Anwendung darauf zugreift. Sie können die Rohtabellen-Erstellungs-SQL entweder manuell schreiben oder aus einem \Cake\Database\Schema\TableSchema generieren Instanz, die temporäre Tabellen unterstützt.

Sie können das Schemaobjekt entweder explizit erstellen:

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

oder lassen Sie es vom Tabellenobjekt generieren, indem Sie Ihr Felddefinitionsarray verwenden:

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

Sie können dann die Tabellenerstellungs-SQL aus dem Schemaobjekt generieren und für die Datenbank ausführen:

$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 wäre ein Array von SQL-Befehlen, die zum Erstellen der Tabelle erforderlich sind, etwa in der Art von:

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

Beachten Sie, dass es zu Caching-Problemen kommen kann, wenn Sie das Schema nicht dem Tabellenobjekt zuweisen, da das zwischengespeicherte Schema nicht mehr übereinstimmen würde, wenn Sie die Tabellendefinition ändern und den Cache nicht löschen.

Siehe auch