2012-12-27 9 views
4

Je voudrais récupérer toutes les tables de ma base de données sous forme de liste.Symfony2 - Afficher toutes les tables de la base de données

J'ai essayé de faire un "Afficher les bases de données" sur une requête mais comme je n'utilise pas de classe I définie (entité) dans symfony cela ne fonctionne pas.

Et avec DQL:

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

    $result = $query->getResult(); 

Cette erreur:

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

Toute idée me aider?

Répondre

4

j'ai un cas couple où je dois utiliser des instructions SQL complexes/fonctions que je viens Couldn ne fais pas en DQL. Heureusement, Symfony2/doctrine fournit une méthode pour saisir la connexion de base de données actuelle et contourner entièrement la doctrine.

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

Soyez très prudent lorsque vous utilisez cette méthode, cependant. Puisque vous contournez la doctrine, vous devez gérer vous-même les problèmes de sécurité comme l'injection SQL.

+0

Merci bro <3 fonctionne comme un charme. – hyptos

2

Doctrine est un ORM, il n'est pas destiné à lister toutes les bases de données. A côté de cela, généralement pour l'utilisateur actuel, vous n'avez pas le droit d'afficher toutes les bases de données sur le serveur, cela peut s'avérer être une grande faille de sécurité.

Basiquement, la doctrine ne sait pas comment interpréter votre requête, vous devez utiliser une requête native pour cela: Doctrine Native Query

4

Comme mentionné dans une autre réponse, vous pouvez utiliser Doctrine\DBAL pour que:

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

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

Et puis écrit tout simplement les tables comme Array:

var_dump($sm->listDatabases()); 
+1

Vous pouvez également faire -> listTableNames() pour obtenir tous les tabels – Laurence

+0

Je reçois erreur: Erreur fatale: Impossible d'utiliser l'objet de type stdClass en tant que tableau doctrine \ dbal \ lib \ Doctrine \ DBAL \ Schéma \ MySqlSchemaManager.php sur la ligne 99 – vee

+0

@ Vee comment l'appelez-vous? Ou est-ce un traitement ultérieur au lieu d'un vidage? – kaiser

1

Mes 2 cents:

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

Cela vous donnera un tableau de noms de tables.

Questions connexes