How to truncate a table using Doctrine 2?

后端 未结 5 1182
走了就别回头了
走了就别回头了 2020-12-13 18:00

I assume that I need to build a native query to truncate a table using Doctine2.

$emptyRsm = new \\Doctrine\\ORM\\Query\\ResultSetMapping();
$sql = \'TRUNCAT         


        
5条回答
  •  Happy的楠姐
    2020-12-13 18:41

    This is example truncating method from trait in unit tests.

    /**
     * Cleanup any needed table abroad TRUNCATE SQL function
     *
     * @param string $className (example: App\Entity\User)
     * @param EntityManager $em
     * @return bool
     */
    private function truncateTable (string $className, EntityManager $em): bool {
        $cmd = $em->getClassMetadata($className);
        $connection = $em->getConnection();
        $connection->beginTransaction();
    
        try {
            $connection->query('SET FOREIGN_KEY_CHECKS=0');
            $connection->query('TRUNCATE TABLE '.$cmd->getTableName());
            $connection->query('SET FOREIGN_KEY_CHECKS=1');
            $connection->commit();
            $em->flush();
        } catch (\Exception $e) {
            try {
                fwrite(STDERR, print_r('Can\'t truncate table ' . $cmd->getTableName() . '. Reason: ' . $e->getMessage(), TRUE));
                $connection->rollback();
                return false;
            } catch (ConnectionException $connectionException) {
                fwrite(STDERR, print_r('Can\'t rollback truncating table ' . $cmd->getTableName() . '. Reason: ' . $connectionException->getMessage(), TRUE));
                return false;
            }
        }
        return true;
    }
    

    Please note, that if you do not use $em->flush(), you have a risk to have a problem with next query to doctrine.

    Also you must understand, that if you use this method in a controller, you must change the lines fwrite(STDERR, print_r(... to something your logger service can use.

提交回复
热议问题