我想以列表的形式检索数据库的所有表。
我试图在查询上做一个“显示数据库”,但因为我没有使用我在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'
有什么想法可以帮助我吗?
答案 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