IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Connexion "manuelle" à MySQL et exécution de requêtes SQL pures dans Symfony2 [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Chef de projet MOA
    Inscrit en
    Mars 2012
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Mars 2012
    Messages : 11
    Par défaut Connexion "manuelle" à MySQL et exécution de requêtes SQL pures dans Symfony2
    Bonjour à tous,

    Après 10 ans (ça passe...) de développement sous PHP brut, sans l'aide du moindre Framework, mon projet d'entreprise me pousse à trouver un moyen d'augmenter ma productivité qui me permettra de me lancer à moyen terme. Mon choix s'est donc naturellement porté sur Symfony2, sur lequel je sue sang et eau depuis 3 semaines. On pourra dire ce qu'on voudra, c'est tout de même pas hyper bien documenté. Bref.

    J'ai commencé à développer mon progiciel et je me suis rapidement retrouvé confronté aux Fixtures. Je dois charger de grandes quantités de données (> 100.000 lignes) pour simuler correctement l'utilisation d'un client, je me suis donc naturellement orienté vers la fonction LOAD DATA INFILE de MySQL.

    Malheureusement, je ne sais pas comment me connecter à la BDD avec des commandes Symfony (pas moyen de trouver des infos dans le book). Généralement, quand je veux accéder à la BDD, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            $em = $this->getDoctrine()->getEntityManager();
            // 1. Create Company
            $company = new \Core\ModusBundle\Entity\Company ();
            $company->setContactEmail('xxx@gmail.com');
    Or, dans mon cas, je vais devoir exécuter les requêtes suivantes :
    • CREATE TABLE ... (création d'une table temporaire de type Memory)
    • LOAD DATA INFILE (import du fichier dans la table temporaire pour traitement)


    Du coup, je me pose les questions suivantes :
    • Comment accéder à la base de données via Symfony (l'équivalent de mysql_connect() et mysql_select_db()) ?
    • Comment exécuter mes requêtes (musql_query()) ?


    Si vous avez un éclair de génie, n'hésitez pas à m'en faire part, toute aide sera bienvenue !
    Très bonne soirée

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          $stmt = $this->getDoctrine()->getEntityManager()
                       ->getConnection()
                       ->prepare('SELECT COUNT(id) AS num, foo FROM bar WHERE foobar = :foobar GROUP BY foo');
          $stmt->bindValue('foobar ', $foobar);
          $stmt->execute();
          return $stmt->fetchAll();
    source : http://forum.symfony-project.org/vie...125784#p125667

  3. #3
    Membre averti
    Chef de projet MOA
    Inscrit en
    Mars 2012
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Mars 2012
    Messages : 11
    Par défaut
    Merci beaucoup pour ton aide ! Reste à résoudre un problème : j'ai inséré ces requêtes dans un service, pas dans un contrôleur...Du coup, la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $stmt = $this->getDoctrine()->...
    ne fonctionne pas (Damned !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to undefined method Core\ToolsBundle\Services\MyLoader::getDoctrine() in /var/www/Symfony/src/Core/ToolsBundle/Services/MyLoader.php on line 52
    Je te confesse que je ne sais pas trop comment m'en sortir... Etant hors d'un Controller (i.e. dans une classe qui n'hérite pas de la classe Controller) je n'ai pas les méthodes nécessaires... Au cas où, voici un extrait du code de mon service (je n'utilise pas de classe externe...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    namespace Core\ToolsBundle\Services;
     
    class MyLoader {
     
        public $entity;
        public $file;
        public $companyBranch;
        public $folder;
        public $mapping;
     
        public function __construct($entity = NULL, $file = NULL,

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Il faut envoyer l'EntityManager en parametre à ton service par injection de dependance.

  5. #5
    Membre averti
    Chef de projet MOA
    Inscrit en
    Mars 2012
    Messages
    11
    Détails du profil
    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Mars 2012
    Messages : 11
    Par défaut
    Ca marche ! Merci beaucoup pour votre aide à tous les deux ! Pour ceux que ça intéresserait, voici le code final du Service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?php
     
    namespace Core\ToolsBundle\Services;
     
    class MyLoader {
     
        public $entity;
        public $file;
        public $companyBranch;
        public $folder;
        public $mapping;
        private $em;
     
        public function __construct(\Doctrine\ORM\EntityManager $em)  {
            $this->em = $em;
        }
     
        public function import () {
            $time_start = microtime(true); 
            $cols = implode(',',$this->mapping);
     
            if ($this->folder != NULL OR $this->companyBranch != NULL) {
     
                // 1. IMPORT IN MEMORY TABLE
                //------------------------------------------------------------------
     
                // 1.1 Create Table
                $TmpTable = "tmp".mt_rand();
                $sql = "CREATE TABLE $TmpTable
                    (
                    id int NOT NULL AUTO_INCREMENT,
                    label varchar(100) COLLATE utf8_unicode_ci NOT NULL,
                    PRIMARY KEY (id)
                    )
                    ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
     
                $stmt = $this->em->getConnection()->prepare($sql);
                $stmt->execute();
    Et le code dans service.yml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    parameters:
        core.tools.myloader.class: core\ToolsBundle\Services\MyLoader
     
    services:
        core.tools.myloader :
            class: %core.tools.myloader.class%
            arguments: [@doctrine.orm.entity_manager]

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pas top la requête brute utilise plutôt les outils de migration, utilise aussi le DoctrineFixturesBundle pour l'import

    Apres a savoir que mysql gérer direct les tables en CSV, donc en local l'import est très facile : création de la table, copie du fichier direct dans le dossier data de mysql

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ADO.Net][C#/Mysql] Comment exécuter une requête paramétrée?
    Par wremacle dans le forum Accès aux données
    Réponses: 6
    Dernier message: 07/02/2006, 16h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo