我想以列表的形式检索我的数据库的所有表.
我试图在查询上做一个"显示数据库",但因为我没有使用我在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)
有什么好主意帮我吗?
如在不同的答案中所提到的,您可以使用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)
我的 2 美分:
getContainer()->get('doctrine.dbal.default_connection')->getSchemaManager()->listTableNames()
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个表名数组。
我有几个案例需要使用复杂的 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 注入。