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

时间:2012-12-27 15:47:21

标签: php mysql symfony

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

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

使用DQL:

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

    $result = $query->getResult();

此错误:

[Syntax Error] line 0, col 0: Error: Expected SELECT, UPDATE or DELETE, got 'show'

有什么想法可以帮助我吗?

5 个答案:

答案 0 :(得分:5)

正如其他答案所述,您可以使用Doctrine\DBAL

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

/** @type \Doctrine\DBAL\Schema\MySqlSchemaManager $sm */
$sm = $connection->getSchemaManager();

然后只需将表格列为Array

var_dump( $sm->listDatabases() );

答案 1 :(得分:4)

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

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

使用此方法时,请非常小心。由于您绕过了学说,因此您需要自己处理SQL注入等任何安全问题。

答案 2 :(得分:4)

您可以将Doctrine DBAL添加到您的项目中,它将为您提供所需的工具。您可以列出数据库,数据库中的表,表中的列等等

Doctrine DBAL文档中的更多内容:http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/schema-manager.html

答案 3 :(得分:4)

我的2美分:

getContainer()->get('doctrine.dbal.default_connection')->getSchemaManager()->listTableNames()

这将为您提供一系列表名。

答案 4 :(得分:2)

Doctrine是一个ORM,它不打算列出所有数据库。除此之外,通常对于当前用户,您无权显示服务器中的所有数据库,这可能被证明是一个很大的安全漏洞。

基本上,doctrine不知道如何解释您的查询,您必须使用本机查询:Doctrine Native Query