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 :

Est-il possible d'utiliser des fonctions PL/PgSQL, Transac-SQL (etc.) avec Symfony2? [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Points : 141
    Points
    141
    Par défaut Est-il possible d'utiliser des fonctions PL/PgSQL, Transac-SQL (etc.) avec Symfony2?
    Bonjour à tous (et bonne année!),

    J'envisage d'utiliser Symfony2 pour un projet qui reprendrait une ancienne base de données PostGIS (PostgreSQL avec son module géographique).

    J'ai pu générer avec Doctrine2 les entités correspondant à la partie non-GIS du schema de la base, moyennant deux petit tweaks pour le mapping de types qui n'étaient pas reconnus par Doctrine. A terme, je peux sans trop de problèmes modifier la déclaration des types dans la base sans perdre mes données.
    Mais un problème plus grand risque de me bloquer: je ne suis pas sûr que Doctrine et Symfony pourront prendre en charge le type de données GEOMETRY que PostGIS utilise pour stocker des objets géographiques.

    Une solution alternative serait d'utiliser les fonctions en PL/pgSQL de PostGIS qui permettent de générer un objet géographique à partir d'une chaîne de texte. Mais je ne suis pas sûr que Symfony et le langage DQL de Doctrine permettent de les manipuler. Il est vrai que la philosophie de Symfony est justement de se placer au dessus des différents dialectes SQL (PL/SQL, PL/PgSQL, TransacSQL etc...). Mais il serait intéressant de pouvoir utiliser ponctuellement les fonctions de niveau SQL pour des tâches bien précises, ne pouvant pas forcément être effectuées au niveau de l'applicatif PHP (manipulation d'objets géographiques avec PostGIS, reconnaissance de chaînes de texte basée sur la phonétique etc...).
    Je n'ai pas trouvé de documentation à ce sujet sur le web, est-ce que vous pourriez m'indiquer s'il est possible de procéder ainsi?

  2. #2
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Points : 141
    Points
    141
    Par défaut
    Je crois que j'ai trouvé une solution en me basant sur ce lien qui concernait les versions antérieures de Doctrine et Symfony.
    http://groups.google.com/group/doctr...a6853ec8a446d1
    La syntaxe avait entretemps changée avec les versions 2, mais le principe décrit reste valable et un coup d’œil dans les API permet de retrouver le nom actuel des classes et méthodes.

    L'accesseur "getConnection()" de la classe "EntityManager" permet d'accéder à la classe "Connection" de Doctrine2. Celle-ci contient une méthode "exec()" qui peut exécuter des requêtes SQL qui "court-circuitent" le mapping et accèdent donc aux fonctions pl/pgSQL.
    Attention ces requêtes sont sûrement exécutées avec le compte utilisateur et le mot de passe principal du projet! Il faut être précautionneux au moment de les encapsuler dans le système de gestion des privilèges de Symfony

    Exemple avec les valeurs à encoder passées dans les paramètres HTTP GET. La fonction pl/pgsql à appeler est ici GEOMFROMTEXT qui prend deux paramètres (une chaîne de caractères de type "POINT(X Y)" et un entier qui sert de numéro de code pour la projection géographique):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      /**
         * @Route("/insertionpoint/{description}/{latitude}/{longitude}/{projection}")
         */
        public function insertPostGISPointAction($description, $latitude, $longitude, $projection)
        {
    		$em = $this->container->get('doctrine')->getEntityManager();
    		$connection=$em->getConnection();
    		$st=$connection->exec("INSERT INTO test_gis_doctrine(id, description, the_geom) SELECT COALESCE(MAX( id ),0)+1 , '".$description."', GEOMFROMTEXT('POINT(".$longitude." ".$latitude.")', ".$projection.") FROM test_gis_doctrine;");
        }
    EDIT:

    Les méthodes suivantes de la classe Connection sont fort utiles pour remapper le résultat d'une query dans un objet car elles renvoient le résultat dans un tableau:

    array fetchAll(string sql, array params)
    Prepares and executes an SQL query and returns the result as an associative array..

    array fetchArray(string statement, array params)
    Prepares and executes an SQL query and returns the first row of the result as a numerically indexed array..

    array fetchAssoc(string statement, array params)
    Prepares and executes an SQL query and returns the first row of the result as an associative array..

    mixed fetchColumn(string statement, array params, int colnum)
    Prepares and executes an SQL query and returns the value of a single column of the first row of the result..

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,
    Effectivement Doctrine2 ne supporte pas nativement les bases de données spatiales, néammoins il y a des possibilités d'étendre les types et les functions supportés.

    http://www.doctrine-project.org/docs...-mapping-types

    un exemple avec mysql spatial extension
    http://codeutopia.net/blog/2011/02/1...in-doctrine-2/

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/03/2011, 10h08
  2. Réponses: 1
    Dernier message: 03/12/2010, 00h26
  3. Est-il possible d'utiliser la fonction TOP avec un argument variable ?
    Par 16-Marco dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 06/03/2007, 23h21
  4. [SimpleXML] Est-il possible d'utiliser des expressions XPATH 2.0 avec simplexml ?
    Par ANISSS dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/11/2006, 10h14
  5. Est-il possible d'utiliser des fichiers xsl en cascade ?
    Par Faekk dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/08/2005, 13h34

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