Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-2324

mapOneToMany not working after upgrade to symfony2.1

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Invalid
    • Affects Version/s: 2.3.2
    • Fix Version/s: None
    • Component/s: ORM
    • Labels:
      None
    • Environment:
      debian 6, php 5.4.10

      Description

      After updating to from symfony 2.0 to symfony 2.1, creating a new mapping did not work when using \Doctrine\ORM\Mapping\ClassMetadata::mapOneToMany().

      The code used was:

              /** @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */
              $metadata = $this->getDoctrine()->getEntityManager()->getClassMetadata('SecretSecretBundle:Deal');
      
              if (!array_key_exists('rolap', $metadata->getAssociationMappings())) {
                  // use a temporary join mapping
                  $metadata->mapOneToMany(array(
                      'targetEntity' => 'Secret\SecretBundle\Entity\RolapDealP1m',
                      'fieldName' => 'rolap',
                      'mappedBy' => 'deal',
                  ));
              }
      

      A manyToOne mapping from RolapDealP1m to Deal was already created in the RolapDealP1m entity class.

      Then, a query using the queryBuilder was created like this:

      $qb=$repo->createQueryBuilder('Deal');
      $qb
          ->join('Deal.rolap', 'Rolap')
      [additional joins]
          ->select(
              array(
                  'Deal.number number',
                  'Deal.product productName',
      [additional fields]
              )
          )
      [additional where and group by]
      ;
      

      The problem occurs, when doing a simple

      $qb->getQuery()->getResult();
      

      On symfony 2.0 using doctrine 2.2.2 it worked fine, the result was returned.
      On symfony 2.1 using doctrine 2.3.2 and 2.2.2 an error occurs:

      Notice: Undefined index: rolap in /var/www/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php line 366
      

      As a workaround, we added the OneToMany mapping to the Deal Entity instead of using a temporary mapping. This worked fine with symfony 2.1/doctrine 2.3.2.

      We think there has been a regression when trying to create temporary mappings.

        Activity

        Hide
        Marco Pivetta added a comment -

        Please validate the generated mappings with Doctrine\ORM\Tools\SchemaValidator.php

        Show
        Marco Pivetta added a comment - Please validate the generated mappings with Doctrine\ORM\Tools\SchemaValidator.php
        Hide
        Thomas Mayer added a comment - - edited

        Using symfony 2.0 and doctrine 2.2.2, after the mapOneToMany() mapping SchemaValidator returns
        'Secret\SecretBundle\Entity\Deal' =>
        array (size=1)
        0 => string 'The field Secret\SecretBundle\Entity\Deal#rolap is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity Secret\SecretBundle\Entity\RolapDealP1m#deal does not contain the required 'inversedBy=rolap' attribute.' (length=271)

        However, this works fine.

        SchemaValidator returns the same when using symfony 2.1/doctrine 2.3.2, which is not working any more when doing the getResult()

        Show
        Thomas Mayer added a comment - - edited Using symfony 2.0 and doctrine 2.2.2, after the mapOneToMany() mapping SchemaValidator returns 'Secret\SecretBundle\Entity\Deal' => array (size=1) 0 => string 'The field Secret\SecretBundle\Entity\Deal#rolap is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity Secret\SecretBundle\Entity\RolapDealP1m#deal does not contain the required 'inversedBy=rolap' attribute.' (length=271) However, this works fine. SchemaValidator returns the same when using symfony 2.1/doctrine 2.3.2, which is not working any more when doing the getResult()
        Hide
        Marco Pivetta added a comment -

        Thomas Mayer are you able to write a failing test case for this one? It may just be an undocumented BC break though.

        Show
        Marco Pivetta added a comment - Thomas Mayer are you able to write a failing test case for this one? It may just be an undocumented BC break though.
        Hide
        Thomas Mayer added a comment -

        I will try to track it down to a smaller model for the test case.

        Show
        Thomas Mayer added a comment - I will try to track it down to a smaller model for the test case.
        Hide
        Benjamin Eberlei added a comment -

        Changing the mapping of entities after loading from a driver is undefined behavior.

        Show
        Benjamin Eberlei added a comment - Changing the mapping of entities after loading from a driver is undefined behavior.

          People

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

            Dates

            • Created:
              Updated:
              Resolved: