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

Bibliothèques et frameworks PHP Discussion :

Double belongsToMany entre deux mêmes tables. [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2012
    Messages : 25
    Points : 46
    Points
    46
    Par défaut Double belongsToMany entre deux mêmes tables.
    Bonjour tout le monde,
    (Encore moi oui je sais que je peux compter sur vous )
    Cette fois je possède deux tables:
    Users(id, first_name, last_name, email)
    Modules(id, name, description)
    Et j'ai donc deux tables d'associations entre ces tables:
    modules_users(module_id, user_id) => pour représenter les membres d'un module
    modules_owners(module_id, user_id) => pour représenter les propriétaires d'un module
    quand un utilisateur crée un module, j'essai donc de l'ajouter dans l'association modules_owners.

    Mais quand je fais un save en ayant ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->request->data['users'][0] = $currentUser;
    l'association se sauvegarde seulement dans modules_users et je sais pas comment faire pour dire qu'elle doit être dans
    modules_owners.
    Je me doutes bien que d'après mes tables cakePHP a pas de moyens de faire la différences, mais je vois pas comment lui indiquer..
    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
    class ModulesTable extends Table
    {
     
        /**
         * Initialize method
         *
         * @param array $config The configuration for the Table.
         * @return void
         */
        public function initialize(array $config)
        {
            $this->table('modules');
            $this->displayField('name');
            $this->primaryKey('id');
            $this->belongsToMany('Groups', [
                'foreignKey' => 'module_id',
                'targetForeignKey' => 'group_id',
                'joinTable' => 'modules_groups'
            ]);
        $this->belongsToMany('Users', [
                'foreignKey' => 'module_id',
                'targetForeignKey' => 'user_id',
                'joinTable' => 'modules_owners'
            ]);
        $this->belongsToMany('Users', [
                'foreignKey' => 'module_id',
                'targetForeignKey' => 'user_id',
                'joinTable' => 'modules_users'
            ]);
        }
    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
    /**
     * Users Model
     */
    class UsersTable extends Table
    {
     
        /**
         * Initialize method
         *
         * @param array $config The configuration for the Table.
         * @return void
         */
        public function initialize(array $config)
        {
            $this->table('users');
            $this->displayField('first_name');
            $this->primaryKey('id');
            $this->belongsTo('Roles', [
                'foreignKey' => 'role_id'
            ]);
            $this->belongsToMany('Groups', [
                'foreignKey' => 'user_id',
                'targetForeignKey' => 'group_id',
                'joinTable' => 'groups_users'
            ]);
        $this->belongsToMany('Modules', [
                'foreignKey' => 'user_id',
                'targetForeignKey' => 'module_id',
                'joinTable' => 'modules_users'
            ]);
        $this->belongsToMany('Modules', [
                'foreignKey' => 'user_id',
                'targetForeignKey' => 'module_id',
                'joinTable' => 'modules_owners'
            ]);
        }
    Il y'a donc un problème pour cakePHP mais je vois pas comment modéliser les informations entre un module et un utilisateur qui peut soit être un membre d'un module ou un propriétaire (sachant qu'il peut y en avoir plusieurs).

    J'espère avoir été assez claire, sinon dites moi.
    Merci d'avance de vos réponses.

  2. #2
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    En accord avec l'API de CakePHP,
    Parameters
    string $associated
    the alias for the target table. This is used to uniquely identify the association
    array $options optional []
    list of options to configure the association definition
    Tu dois définir une de tes relations avec un alias différent. Tu devras également configurer correctement l'association afin de bien lui faire comprendre qu'une table peut avoir deux associations différentes.

    Penses également à utiliser la clé "propertyName" dans le tableau d'option de configuration si jamais tu as encore des problèmes pour la génération de tes entités dans ton controller.
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2012
    Messages : 25
    Points : 46
    Points
    46
    Par défaut
    D'accord merci j'ai mieux compris les paramètres du coup pour belongsToMany()
    Ce qui fait que ça fonctionne
    Donc pour mes Tables j'ai fait:
    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
     
    class ModulesTable extends Table
    {
     
        /**
         * Initialize method
         *
         * @param array $config The configuration for the Table.
         * @return void
         */
        public function initialize(array $config)
        {
            $this->table('modules');
            $this->displayField('name');
            $this->primaryKey('id');
            $this->belongsToMany('Groups', [
                'foreignKey' => 'module_id',
                'targetForeignKey' => 'group_id',
                'joinTable' => 'modules_groups'
            ]);
     
    		// Users
     
    	$this->belongsToMany('Users', [
    	    'className' => 'Users',
                'foreignKey' => 'module_id',
                'targetForeignKey' => 'user_id',
                'joinTable' => 'modules_users',
            ]);
    	$this->belongsToMany('Owners', [
    	     'className' => 'Users',
                'foreignKey' => 'module_id',
                'targetForeignKey' => 'user_id',
                'joinTable' => 'modules_owners',
    	    'propertyName' => 'owners'
            ]);
        }
    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
    46
    47
    48
    49
    50
    class UsersTable extends Table
    {
     
        /**
         * Initialize method
         *
         * @param array $config The configuration for the Table.
         * @return void
         */
        public function initialize(array $config)
        {
            $this->table('users');
            $this->displayField('first_name');
            $this->primaryKey('id');
            $this->belongsTo('Roles', [
                'foreignKey' => 'role_id'
            ]);
     
    		//Modules
     
    	$this->belongsToMany('Modules', [
    	    'className' => 'Modules',
                'foreignKey' => 'user_id',
                'targetForeignKey' => 'module_id',
                'joinTable' => 'modules_users',
            ]);
            $this->belongsToMany('ModuleOwner', [
                'className' => 'Modules',
                'foreignKey' => 'user_id',
                'targetForeignKey' => 'module_id',
                'joinTable' => 'modules_owners',
    	    'propertyName' => 'module_owner'
            ]);
     
    		//Groups
     
            $this->belongsToMany('Groups', [
    	    'className' => 'Groups',
                'foreignKey' => 'user_id',
                'targetForeignKey' => 'group_id',
                'joinTable' => 'groups_users'
            ]);
    	$this->belongsToMany('GroupOwner', [
    	    'className' => 'Groups',
                'foreignKey' => 'user_id',
                'targetForeignKey' => 'group_id',
                'joinTable' => 'groups_owners',
    	    'propertyName' => 'group_owner'
            ]);
        }
    Le propertyName est bien important, mais j'ai aussi rajouté className pour que cakePHP puisse bien faire l'association avec les autres models et controllers.

    Et par exemple pour récupérer ensuite les Modules où l'utilisateur et propriétaire et ceux où il est juste membre depuis le controller Users:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $user = $this->Users->get($id, [
    				'contain' => ['ModuleOwner', 'Modules'] // on fait le lien avec les alias déclarés dans les models
    			]);
    			$this->set('user', $user);
    			$this->set('_serialize', ['user']);
    Ensuite dans la vue associée pour accéder aux modules où l'utilisateur est propriétaire ça donne:
    qui est donc le paramètre propertyName

    Merci encore

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

Discussions similaires

  1. Double jointure entre deux tables
    Par outland42 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/06/2015, 07h41
  2. Access: double relation entre deux tables
    Par Michael_Access dans le forum Modélisation
    Réponses: 2
    Dernier message: 29/01/2015, 16h34
  3. [2008] Left Outer Join entre deux mêmes tables
    Par jslpfasc2 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 10/03/2014, 16h10
  4. [AC-2003] Relations multiples entre deux mêmes tables
    Par DuracellSubaquatique dans le forum Modélisation
    Réponses: 8
    Dernier message: 04/08/2009, 08h57
  5. Double comptage dans une même table
    Par Patoune dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/03/2007, 17h49

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