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

Doctrine2 PHP Discussion :

Multiples colonnes de jointures


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 31
    Par défaut Multiples colonnes de jointures
    Bonjour à tous,

    J'ai débuté il y a peu sur Symfony et coince sur un truc qui me parait pourtant simple. Un oeil avisé saura peut-être m'aider

    Je souhaiterais lier une table "ecriture" à une table "budget"

    dans écriture, il y a un champ numero_sectionAnalytique et numero_service
    dans budget il y a en ID de la table numero_sectionAnalytique, numero_service.

    le but final étant de réussir à retourner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $qb = $this->getEntityManager()
                ->createQuery("
                SELECT e,
                        b,
                        SUM(e.montantCredit)            AS sa__montantCredit,
                        SUM(e.montantDebit)             AS sa__montantDebit
                    FROM MyAppComptabiliteBundle:Ecriture e
                    LEFT JOIN e.budget b
                    WHERE ".$params[0]."
                    GROUP BY e.numero_sectionAnalytique
                    ORDER BY e.numero_sectionAnalytique
                ");
    J'ai crée mes entités comme je pense être le mieux et lors de la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    doctrine:schema:update --force
    j'ai une erreur qui est généré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Updating database schema...
    [PDOException]                                                                             
      SQLSTATE[HY000]: General error: 1005 Can't create table 'compta.#sql-b84_86' (errno: 150)
    j'ai ensuite fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    doctrine:schema:update --dump-sql
    ce qui m'a donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE ecriture ADD CONSTRAINT FK_FA7FEFBD791E1EFF27C98473 FOREIGN KEY (numero_sectionAnalytique, numero_service) REFERENCES Budget(numero_sectionAnalytique, numero_service)
    j'ai tenté de l'inserer directement dans ma base via SQL et je me retrouve avec la même erreur si ce n'est le nom de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1005 - Can't create table 'compta.#sql-b84_83' (errno: 150)

    Voici mes différentes entités :

    Ecriture, représente une écriture comptable identifié par son id.
    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
    39
    40
    41
    42
    43
    44
    45
    /**
     * @ORM\Entity
     * @ORM\Entity(repositoryClass="MyApp\ComptabiliteBundle\Repository\EcritureRepository")
     */
    class Ecriture
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected   $id;
     
        /**
         * @ORM\Column(type="string", length=15)
         */
        protected $numero_service;
     
        /**
         * @ORM\Column()
         */
        protected $intitule_service;
     
        /**
         * @ORM\Column(type="string", length=15)
         */
        protected $numero_sectionAnalytique;
     
        /**
         * @ORM\Column()
         */
        protected $intitule_sectionAnalytique;
     
        /**
         * @ORM\ManyToOne(targetEntity="MyApp\ComptabiliteBundle\Entity\Budget", inversedBy="ecritures")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="numero_sectionAnalytique", referencedColumnName="numero_sectionAnalytique"),
         *   @ORM\JoinColumn(name="numero_service", referencedColumnName="numero_service")
         * })
         */
        protected   $budget;
    .
    .
    .
    }
    Budget, représente un budget identifié par un numéro de service, une section analytique et une année.
    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
    39
    40
    41
    42
    /**
     * @ORM\Entity
     */
    class Budget
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="string", length=15)
         */
        protected $numero_service;
     
        /**
         * @ORM\Id
         * @ORM\Column(type="string", length=15)
         */
        protected $numero_sectionAnalytique;
     
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         */
        protected $annee;
     
        /**
         * @ORM\OneToMany(targetEntity="MyApp\ComptabiliteBundle\Entity\Ecriture", mappedBy="budget")
         */
        protected $ecritures;
     
     
        /**
         * @ORM\Column(type="decimal", scale=2, precision=10)
         */
        protected $montantCharges;
     
        /**
         * @ORM\Column(type="decimal", scale=2, precision=10)
         */
        protected $montantRecettes;
    .
    .
    .
    }
    quelqu'un est-il déjà tombé sur un cas de figure comme ça?
    Peut-être que je me suis trompé dans la manière de joindre mes tables?

    Merci de votre aide!

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,
    Au niveau de ton mapping, il y a des choses que je ne comprend pas:

    l'identifiant de Budget est composé de 3 Colonnes
    alors que la relation Ecriture hasOne Budget ne fait référence qu'à deux colonnes (donc on peut avoir plusieurs Budgets pour une écriture )

    D'une manière générale (ça n'a pas forcément de rapport avec ton problème actuel), j'ai l'impression que tu utilise des clés étrangères comme attribut de tes entités (numero_service par ex), alors qu'avec Doctrine on évite cela et on met directement en place une association
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Budget{
    /**
    * @ORM\ManyToOne(targetEntity="Service")
    * @ORM\JoinColumn(name="numero_service", referencedColumnName="numero_service")
    */
    protected $service;
    Ce qui ne t'empèche pas éventuellement d'avoir un attribut numero_service mais il doit être en lecture seule.

    As tu consulté la doc sur les clés composés avec Doctrine?
    http://www.doctrine-project.org/docs...mary-keys.html
    D'un autre coté les clés composés sont plutôt déconseillées http://www.doctrine-project.org/docs...composite-keys

  3. #3
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 31
    Par défaut
    Tout d'abord, merci de ta réponse.

    je n'ai pas d'entité raccroché à service en effet les tables que j'ai donné sont les seuls tables de mon application. en plus de mon entité user.

    j'avais bien compris le coup des entités et c'est pour ça que j'essayai de joindre mon entité budget et écriture.

    du coup je ne vois pas comment joindre mes 2 tables.

    le 3eme champ ID est "année" qui est rempli par l'utilisateur en fait.

    Ce que tu me conseil de faire en fait c'est de transformer ma table budget pour qu'elle est un Id seul.

    Mais dans ce cas comment je joins avec doctrine ?

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    J'ai fait quelques test et en fait je vois pas trop d'oû vient le problème.

    Si tu as uniquement deux entités et un schéma un peu déviant par rapport aux recommandations de Doctrine, l'utilisation d'un ORM va sans doute te compliquer les choses alors que normalement ça devrait les simplifier,là on est juste sur la génération de la base de données et lorsque l'on aborde les formulaires ça va encore se compliquer (SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'numero_service' cannot be null : le formulaire a bien un champ numéro service rempli mais la relation Budget semble prendre le dessus...).

    L'utilisation de Doctrine\ORM n'est pas obligatoire avec Symfony et la couche Doctrine\DBAL fourni déjà quelques méthodes pratiques pour mettre en place un CRUD en manipulant des tables "à l'ancienne" plutôt que des entités (ex: $db->update($tableName,$arrayOfAttributes) ).

    Au passage plutôt qu'une clé composé, tu peux effectivement mettre un id simple autogénéré et une contrainte unique sur tes champs
    http://www.doctrine-project.org/docs...iqueconstraint

    Au final je ferais soit un shema doctrine avec des entités classique et sans duplication des données annee,numero_service,etc...(service(numero,name), Budget(id,annee,hasOne Service,hasMany Ecriture),Ecriture(id,hasOne Budget...) etc...
    Soit garder ce shéma et utiliser Doctrine\DBAL.

    C'est juste un avis et peut-être qu'il y a une solution à ce problème (je n'ai pas vraiment utilisé de clés composés dans mes devs).

  5. #5
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 31
    Par défaut
    j'ai rechangé mon schéma pour repasser à des entités du coup.

    j'ai passé budget avec un ID et le reste lié avec doctrine.

    et ta dernière remarque m'a fait réaliser en fait que ce n'étais pas par écriture qu'il fallait que je passe pour afficher le budget mais passer par budget -> sectionAnalytique -> liste des écritures.

    Merci d'avoir passé du temps à chercher pour m'aider

    A bientôt sur le forum

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

Discussions similaires

  1. [Débutant] calcul multiple colonne en vb.net
    Par sabi11 dans le forum VB.NET
    Réponses: 1
    Dernier message: 28/05/2012, 11h53
  2. [AC-2003] UPDATE avec de multiples colonnes
    Par jimay dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 14/05/2009, 10h08
  3. affichage listebox multiple colonne à partir de plusieurs combobox
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 02/04/2008, 09h51
  4. Creation d'une table avec une colonne a multiple colonne
    Par anubis82 dans le forum Débuter
    Réponses: 2
    Dernier message: 30/03/2008, 16h28
  5. listebox multiple colonne
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/03/2008, 13h47

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