Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-2119

Problem with inheritance type: INHERITANCE_TYPE_NONE and INHERITANCE_TYPE_TABLE_PER_CLASS

    Details

    • Type: Bug Bug
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 2.1
    • Fix Version/s: None
    • Component/s: DQL, Tools
    • Labels:

      Description

      I tried to create inheritance entities with save policy table per class.
      Simple fileds was created normally, but a field with ManyToOne type was lost.

      I had found a solution.

      In Doctrine\ORM\Tools\SchemaTool
      ...

      private function _gatherRelationsSql($class, $table, $schema)
          {
              foreach ($class->associationMappings as $fieldName => $mapping) {
      
                 // if (isset($mapping['inherited'])) { // - old version
      
      	/**
                   * SSW
                   * It's the solution
                   */
      	if (isset($mapping['inherited']) && !$class->isInheritanceTypeNone() && !$class->isInheritanceTypeTablePerClass() ) {
                      continue;
                  }            
      
                  $foreignClass = $this->_em->getClassMetadata($mapping['targetEntity']);
      ...
      

      But it was enough. In DQL query a simple query was made wrong.

      I had found a solution again.
      In Doctrine\ORM\Query\SqlWalker
      ...

      public function walkSelectExpression($selectExpression)
      ...
      
                      // original => if (isset($mapping['inherited'])){
                      // It's the solution
                      if (isset($mapping['inherited']) && !$class->isInheritanceTypeNone() && !$class->isInheritanceTypeTablePerClass()) {
                          $tableName = $this->_em->getClassMetadata($mapping['inherited'])->table['name'];
                      } else {
                          $tableName = $class->table['name'];
                      }
      ...
      

      This problems are topical for inheritance type: INHERITANCE_TYPE_NONE and INHERITANCE_TYPE_TABLE_PER_CLASS.

      I don't know, may be my solutions are wrong. But some programmers want to correctly work with INHERITANCE_TYPE_TABLE_PER_CLASS.

      Sorry for my english.

      1. dump.sql
        5 kB
        SergSW
      2. SSWTestBundle.rar
        5 kB
        SergSW

        Activity

        SergSW created issue -
        SergSW made changes -
        Field Original Value New Value
        Attachment Attach.php [ 11342 ]
        Attachment AttachTree.php [ 11343 ]
        SergSW made changes -
        Attachment Attach.php [ 11342 ]
        SergSW made changes -
        Comment [ Entities ]
        SergSW made changes -
        Comment [ I'm sorry, but I haven't time for write a test case.
        I try to write a test case as will the time.
        I attached Entity with the problem.
        In database I lost a 'user' field in the 'AttachTree' table. ]
        SergSW made changes -
        Attachment SSWTestBundle.rar [ 11344 ]
        SergSW made changes -
        Attachment AttachTree.php [ 11343 ]
        SergSW made changes -
        Attachment dump.sql [ 11345 ]
        Benjamin Eberlei made changes -
        Description I tried to create inheritance entities with save policy table per class.
        Simple fileds was created normally, but a field with ManyToOne type was lost.

        I had found a solution.

        In Doctrine\ORM\Tools\SchemaTool
        ...
        private function _gatherRelationsSql($class, $table, $schema)
            {
                foreach ($class->associationMappings as $fieldName => $mapping) {

                   // if (isset($mapping['inherited'])) { // - old version

        /**
                     * SSW
                     * It's the solution
                     */
        if (isset($mapping['inherited']) && !$class->isInheritanceTypeNone() && !$class->isInheritanceTypeTablePerClass() ) {
                        continue;
                    }

                    $foreignClass = $this->_em->getClassMetadata($mapping['targetEntity']);
        ...

        But it was enough. In DQL query a simple query was made wrong.

        I had found a solution again.
        In Doctrine\ORM\Query\SqlWalker
        ...
        public function walkSelectExpression($selectExpression)
        ...

                        // original => if (isset($mapping['inherited'])){
                        // It's the solution
                        if (isset($mapping['inherited']) && !$class->isInheritanceTypeNone() && !$class->isInheritanceTypeTablePerClass()) {
                            $tableName = $this->_em->getClassMetadata($mapping['inherited'])->table['name'];
                        } else {
                            $tableName = $class->table['name'];
                        }
        ...

        This problems are topical for inheritance type: INHERITANCE_TYPE_NONE and INHERITANCE_TYPE_TABLE_PER_CLASS.

        I don't know, may be my solutions are wrong. But some programmers want to correctly work with INHERITANCE_TYPE_TABLE_PER_CLASS.

        Sorry for my english.
        I tried to create inheritance entities with save policy table per class.
        Simple fileds was created normally, but a field with ManyToOne type was lost.

        I had found a solution.

        In Doctrine\ORM\Tools\SchemaTool
        ...
        {code}
        private function _gatherRelationsSql($class, $table, $schema)
            {
                foreach ($class->associationMappings as $fieldName => $mapping) {

                   // if (isset($mapping['inherited'])) { // - old version

        /**
                     * SSW
                     * It's the solution
                     */
        if (isset($mapping['inherited']) && !$class->isInheritanceTypeNone() && !$class->isInheritanceTypeTablePerClass() ) {
                        continue;
                    }

                    $foreignClass = $this->_em->getClassMetadata($mapping['targetEntity']);
        ...
        {code}

        But it was enough. In DQL query a simple query was made wrong.

        I had found a solution again.
        In Doctrine\ORM\Query\SqlWalker
        ...
        {code}
        public function walkSelectExpression($selectExpression)
        ...

                        // original => if (isset($mapping['inherited'])){
                        // It's the solution
                        if (isset($mapping['inherited']) && !$class->isInheritanceTypeNone() && !$class->isInheritanceTypeTablePerClass()) {
                            $tableName = $this->_em->getClassMetadata($mapping['inherited'])->table['name'];
                        } else {
                            $tableName = $class->table['name'];
                        }
        ...
        {code}

        This problems are topical for inheritance type: INHERITANCE_TYPE_NONE and INHERITANCE_TYPE_TABLE_PER_CLASS.

        I don't know, may be my solutions are wrong. But some programmers want to correctly work with INHERITANCE_TYPE_TABLE_PER_CLASS.

        Sorry for my english.
        Benjamin Eberlei made changes -
        Status Open [ 1 ] Awaiting Feedback [ 10000 ]
        made changes -
        Status Awaiting Feedback [ 10000 ] In Progress [ 3 ]
        Benjamin Eberlei made changes -
        Status In Progress [ 3 ] Open [ 1 ]

          People

          • Assignee:
            Benjamin Eberlei
            Reporter:
            SergSW
          • Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

            • Created:
              Updated: