Symfony2 - 显示数据库中的所有表

hyp*_*tos 6 php mysql symfony

我想以列表的形式检索我的数据库的所有表.

我试图在查询上做一个"显示数据库",但因为我没有使用我在symfony中定义的类(实体),所以它不起作用.

并使用DQL:

   $em = $this->getDoctrine()->getEntityManager();
   $query = $em->createQuery(
        'show databases');

    $result = $query->getResult();
Run Code Online (Sandbox Code Playgroud)

这个错误:

[Syntax Error] line 0, col 0: Error: Expected SELECT, UPDATE or DELETE, got 'show'
Run Code Online (Sandbox Code Playgroud)

有什么好主意帮我吗?

kai*_*ser 7

如在不同的答案中所提到的,您可以使用Doctrine\DBAL:

/** @type \Doctrine\DBAL\Connection $connection */
$connection = ...;

/** @type \Doctrine\DBAL\Schema\MySqlSchemaManager $sm */
$sm = $connection->getSchemaManager();
Run Code Online (Sandbox Code Playgroud)

然后将表格列为Array:

var_dump( $sm->listDatabases() );
Run Code Online (Sandbox Code Playgroud)


Tho*_*aux 5

我的 2 美分:

getContainer()->get('doctrine.dbal.default_connection')->getSchemaManager()->listTableNames()
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个表名数组。


MrG*_*ass 4

我有几个案例需要使用复杂的 sql 语句/函数,而我在 DQL 中无法做到这一点。幸运的是,Symfony2/doctrine提供了一种获取当前数据库连接并完全绕过doctrine的方法。

//get connection
$conn = $this->get('database_connection');
//run a query
$users= $conn->fetchAll('select * from users');
Run Code Online (Sandbox Code Playgroud)

但是,使用此方法时要非常小心。由于您正在绕过原则,因此您需要自己处理任何安全问题,例如 SQL 注入。