Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-2414

Unable to create One-To-Many relation with composite keys

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Invalid
    • Affects Version/s: Git Master, 2.3.3
    • Fix Version/s: None
    • Component/s: Mapping Drivers, Tools
    • Security Level: All
    • Labels:
    • Environment:
      Ubuntu 12.04, PHP 5.4.9

      Description

      Given these entities :

      /**
       * Class Domain
       *
       * @Entity
       * @Table(name="profils_domains")
       */
      class Domain
      {
          /**
           * @var string
           *
           * @Id
           * @Column(type="string", length=22, nullable=false)
           */
          protected $name = '';
      }
      
      /**
       * Class User
       *
       * @Entity
       * @Table(name="profils_users")
       */
      class User
      {
          /**
           * @var string
           *
           * @Id
           * @Column(type="string", length=22, nullable=false)
           */
          protected $name = '';
      
          /**
           * @var Domain
           *
           * @Id
           * @ManyToOne(targetEntity="Domain", fetch="LAZY")
           * @JoinColumn(name="domain", referencedColumnName="name", onDelete="CASCADE")
           */
          protected $domain;
          
          /**
           * @var Group[]|ArrayCollection
           *
           * @ManyToMany(targetEntity="Group", mappedBy="users")
           */
          protected $groups;
      }
      
      /**
       * Class Group
       *
       * @Entity
       * @Table(name="profils_groups")
       */
      class Group
      {
          /**
           * @var string
           *
           * @Id
           * @Column(type="string", length=22, nullable=false)
           */
          protected $name = '';
      
          /**
           * @var Domain
           *
           * @Id
           * @ManyToOne(targetEntity="Domain", fetch="LAZY")
           * @JoinColumn(name="domain", referencedColumnName="name", onDelete="CASCADE")
           */
          protected $domain;
          
          /**
           * @var User[]|ArrayCollection
           *
           * @ManyToMany(targetEntity="User", indexBy="name", fetch="EXTRA_LAZY")
           * @JoinTable(name="profils_groups_users",
           *      joinColumns={
           * @JoinColumn(name="group_name", referencedColumnName="name", onDelete="CASCADE"),
           * @JoinColumn(name="domain", referencedColumnName="domain", onDelete="CASCADE")
           *          },
           *      inverseJoinColumns={
           * @JoinColumn(name="user_name", referencedColumnName="name", onDelete="CASCADE"),
           * @JoinColumn(name="domain", referencedColumnName="domain", onDelete="CASCADE")
           *          }
           *      )
           */
          protected $users;
      }
      

      I want to link users and groups but only from the same domain.
      I also want a user to be in one group only.
      The only way with composite keys is to make One-To-Many, Unidirectional with Join Table but I can't put unique=true in the @JoinColumn of my inverseJoinColumns because it will generate a unique index for each field and not one composite. I also can't use @UniqueConstraint as it is not supported in @JoinTable.

        Activity

        Bruno CHALOPIN created issue -
        Hide
        Fabio B. Silva added a comment -

        Hi Bruno,

        Could you please explain it a little deeper ?
        you describe an one-to-many relation but your mapping has a many-to-many Group#users.

        Also, you shoud describe operations you are executing and which errors you got.

        Cheers

        Show
        Fabio B. Silva added a comment - Hi Bruno, Could you please explain it a little deeper ? you describe an one-to-many relation but your mapping has a many-to-many Group#users . Also, you shoud describe operations you are executing and which errors you got. Cheers
        Hide
        Bruno CHALOPIN added a comment -

        Hi fabio,

        The relation i was trying to make is http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-unidirectional-with-join-table

        However, it implies to use a unique contraint and as explain above when trying to create the schema via doctrine, as i use composite keys, it will generate 2 unique contraints (one for each field) and not one composite unique constraint.

        Nevertheless, it seems like using composite keys is a lot buggy in doctrine (see http://www.doctrine-project.org/jira/browse/DDC-2413)

        Show
        Bruno CHALOPIN added a comment - Hi fabio, The relation i was trying to make is http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-unidirectional-with-join-table However, it implies to use a unique contraint and as explain above when trying to create the schema via doctrine, as i use composite keys, it will generate 2 unique contraints (one for each field) and not one composite unique constraint. Nevertheless, it seems like using composite keys is a lot buggy in doctrine (see http://www.doctrine-project.org/jira/browse/DDC-2413 )
        Hide
        Benjamin Eberlei added a comment -

        We discussed this in DDC-2413, this is not supported by Doctrine.

        Show
        Benjamin Eberlei added a comment - We discussed this in DDC-2413 , this is not supported by Doctrine.
        Benjamin Eberlei made changes -
        Field Original Value New Value
        Status Open [ 1 ] Resolved [ 5 ]
        Resolution Invalid [ 6 ]

        This list may be incomplete, as errors occurred whilst retrieving source from linked applications:

        • Request to http://www.doctrine-project.org/fisheye/ failed: Error in remote call to 'FishEye 0 (http://www.doctrine-project.org/fisheye/)' (http://www.doctrine-project.org/fisheye) [AbstractRestCommand{path='/rest-service-fe/search-v1/crossRepositoryQuery', params={query=DDC-2414, expand=changesets[0:20].revisions[0:29],reviews}, methodType=GET}] : Received status code 503 (Service Temporarily Unavailable)

          People

          • Assignee:
            Benjamin Eberlei
            Reporter:
            Bruno CHALOPIN
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: