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

ORM PHP Discussion :

Recupérer un alias généré


Sujet :

ORM PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 35
    Par défaut Recupérer un alias généré
    Bonjour,

    Lorsque que je filtre des résultats de recherches avec les filtres de Symfony, j'aimerais pouvoir réutiliser les alias précédemment générés par Doctrine dans mes requêtes afin de ne pas créer de doublons/conflits d'alias.

    Je m'explique:

    - une requête de départ (indiqué dans l'admin generator) :
    $query->innerJoin($query->getRootAlias() . '.Component1 c1');

    - dans mon filtre :
    $query->where($query->getAliasFromComponent('Component1') . '.attr = ?', 'foo');

    La fonction "getAliasFromComponent" restant à définir.

    Est-ce faisable ?

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Il y a quelques méthodes pour cela dans Doctrine_Query. Pour ma part, j'utilise getSqlTableAlias() qui accepte en paramètres le nom du composant (la relation déclarée dans ton schéma) et le nom de la table.

    Exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        public function getByParentsIdsQuery(array $parentsIds, Doctrine_Query $query = null) {
    	if (!$query) {
    	    $query = $this->createQuery();
    	}
     
    	$rootAlias = $query->getRootAlias();
    	$componentAlias = $query->getSqlTableAlias('LinksToParentCategories', 'category');
    	return $query
    			->innerJoin("$rootAlias.LinksToParentCategories $componentAlias")
    			->andWhereIn("$componentAlias.parent_category_id", $parentsIds);
        }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 35
    Par défaut
    Merci pour ta réponse.

    Corrige moi si je me trompe mais, la fonction "getSqlTableAlias" ne renvoie t-elle pas uniquement les alias ?
    Ma problématique ici est de récupérer les alias associés à un model.

    Voici mon algo :

    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
    public static function getComponents($query) {
        $componentsTab = array();
        foreach ($query->getQueryComponents() as $alias => $component) {
          foreach($component['table']->getRelations() as $relatedComponent) 
            $componentsTab[$relatedComponent['alias']] = ?????;
        }
        return $componentsTab;
      }
     
      public static function proceedAliasDefinition(Doctrine_Query $query, $modelsTab, $doublonsAccepted=null) {
        $componentsTab = self::getComponents($query);
     
        foreach($modelsTab as $component) {
          $alias = self::genStr();
     
          if(!class_exists($component))
            throw new Exception("Le composant " . $component . " n'existe pas !");
     
          if(!in_array($component, componentsTab) || (in_array($component, componentsTab) && $doublonsAccepted)) {
            $table_alias = $query->generateNewSqlTableAlias($alias, $component);
            $query->addSqlTableAlias($table_alias, $alias);
            $aliasTab[$component] = $table_alias;
          } else
            $aliasTab[$component] = $componentsTab[$component];
        }
     
        return $aliasTab;
      }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 35
    Par défaut
    Au temps pour moi. C'est exactement ce que je cherchais.

    Merci.

    Edit : malheureusement je n'ai pas réussi à obtenir ce que je souhaite. Voici l'algo du dessus complété en conséquence :

    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
    public static function isComponentInQuery($component, $query) {
        foreach($query->getQueryComponents() as $alias => $compo)
          if($compo['table']->getComponentName() == $component)
            return true;
     
        return array_search($component, $query->getTableAliasMap());
      }
     
      public static function proceedAliasDefinition(Doctrine_Query $query, $modelsTab, $doublonsAccepted=null) {
        foreach($modelsTab as $component) {
          $alias = self::genStr();
     
          if(!class_exists($component))
            throw new Exception("Le composant " . $component . " n'existe pas !");
     
          if(!rorTools::isComponentInQuery($component, $query) || (rorTools::isComponentInQuery($component, $query) && $doublonsAccepted)) {
            $table_alias = $query->generateNewSqlTableAlias($alias, $component);
            $query->addSqlTableAlias($table_alias, $alias);
            $aliasTab[$component] = $table_alias;
          } else {
            $method = $component . 'Table';
            $aliasTab[$component] = $query->getSqlTableAlias($component, $method::getInstance()->getTableName());
          }
        }
    Plusieurs alias peuvent parfois entrer en conflit pour des composants qui sont à la base différents ..

    J'avoue en perdre mon latin.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 35
    Par défaut
    Voici ce que me donne cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($query->getTableAliasMap())
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(6) { ["ruh"]=> string(3) "ruh" ["toi"]=> string(3) "toi" ["sbd"]=> string(3) "sbd" ["zkm"]=> string(3) "zkm" ["ple"]=> string(3) "ple" ["t"]=> string(1) "r" }

  6. #6
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Citation Envoyé par mach2Toulon Voir le message
    Plusieurs alias peuvent parfois entrer en conflit pour des composants qui sont à la base différents ..
    Entrer en conflit comment ?

    Les alias sont générés pour une requête donnée - ce sont des alias SQL, pas des alias de modèle. Et pour une requête donnée, getSqlTableAlias() garantit l'unicité de l'alias.

    NB : si l'alias n'est pas défini, elle appelle generateSqlTableAlias(). S'il est défini, elle le renvoie.

    Si tu as des conflits sur une requête, c'est sans doute que tu ajoutes des alias à la main après l'appel à generateSqlTableAlias(). Ou que tu mélanges les alias obtenus à partir de plusieurs requêtes ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 35
    Par défaut
    Oui, j'ajoute des jointures en fonction des différents filtres dans mes modules Symfony.

    Je veux simplement tester si l'alias du model existe déjà dans la query.
    Si c'est le cas, et sauf contre indication, je le réutilise. Sinon j'en génère un nouveau.

    Ma problématique est de vérifier si un alias existe pour un model/component.

Discussions similaires

  1. Recupérer du HTML généré dynamiquement
    Par Vanmicky dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/01/2013, 14h58
  2. [JS] Recupérer des valeurs d'input généré en php
    Par geforce dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 18/01/2011, 20h52
  3. Recupérer valeur d'un champ généré en js
    Par dbzes59113 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/02/2010, 16h47
  4. Comment recupérer le code SQL généré par Hibernate !
    Par nebisse dans le forum Hibernate
    Réponses: 14
    Dernier message: 21/08/2008, 23h56
  5. Réponses: 3
    Dernier message: 10/07/2005, 17h37

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