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

CakePHP 3:Best Practice per tabelle SQL temporanee

Non c'è bisogno di dirgli di non cerca la tabella, in realtà è l'opposto di quello che vuoi fare, dato che alla fine vuoi accedervi.

La classe table dovrebbe sostanzialmente essere configurata come al solito e dovresti creare la tabella del database temporanea prima che l'applicazione ne esegua l'accesso. Puoi scrivere manualmente l'SQL di creazione della tabella grezza o generarlo da un \Cake\Database\Schema\TableSchema istanza, che supporta le tabelle temporanee.

Puoi creare in modo esplicito l'oggetto schema:

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

oppure lascia che l'oggetto tabella lo generi, usando l'array di definizione dei campi:

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

È quindi possibile generare l'SQL di creazione della tabella dall'oggetto schema ed eseguirlo sul 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 sarebbe una matrice di comandi SQL necessari per creare la tabella, qualcosa sulla falsariga di:

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

Tieni presente che se non assegni lo schema all'oggetto tabella, potresti riscontrare problemi di memorizzazione nella cache, poiché lo schema memorizzato nella cache non corrisponderebbe più quando modifichi la definizione della tabella e non cancelli la cache.

Vedi anche