Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-1150

BasicEntityPersister::expandParameters does not check assiciation mapping when expanding parameters

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 2.2
    • Component/s: ORM
    • Security Level: All
    • Labels:
      None

      Description

      If you try to find entities, filtering them by field with association mapping (ManyToOne) and use an array as a filter argument it will not work:

          $em->getRepository('EntityBundle:Entity')->findBy(array('child' => array(1,2,3)));
          8 Array to string conversion vendor/doctrine-dbal/lib/Doctrine/DBAL/Connection.php 595
      

      I fixed method BasicEntityPersister::expandParameters:

      Index: ../vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php
      ===================================================================
      @@ -1300,6 +1300,9 @@
                   if (isset($this->_class->fieldMappings[$field])) {
                       $type = Type::getType($this->_class->fieldMappings[$field]['type'])->getBindingType();
                   }
      +            if (isset($this->_class->associationMappings[$field])) {
      +                $type = $this->_class->associationMappings[$field]['type'];
      +            }
                   if (is_array($value)) {
                       $type += Connection::ARRAY_PARAM_OFFSET;
                   }
      

        Activity

        Hide
        Benjamin Eberlei added a comment -

        What is $this->_class->associationMappings[$field]['type'] supposed to be? This key does not exist

        Show
        Benjamin Eberlei added a comment - What is $this->_class->associationMappings [$field] ['type'] supposed to be? This key does not exist
        Hide
        Konstantin added a comment -

        The key exists when ToMany association is used. $field['type'] is a real Doctrine's type of the field, because fieldMappings contains entity type of association.

        Checking of this key in Doctrine itself:
        https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php#L386

        Show
        Konstantin added a comment - The key exists when ToMany association is used. $field ['type'] is a real Doctrine's type of the field, because fieldMappings contains entity type of association. Checking of this key in Doctrine itself: https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php#L386
        Hide
        Benjamin Eberlei added a comment -

        Yes buts its the type of the association, MANY_TO_ONE ,ONE_TO_MANY, etc, etc..The type of the associated column is not really known.

        Show
        Benjamin Eberlei added a comment - Yes buts its the type of the association, MANY_TO_ONE ,ONE_TO_MANY, etc, etc..The type of the associated column is not really known.
        Hide
        Konstantin added a comment -

        Heh, I was lucky, thanks for pointing it out

        In any case we still can find this type by the target class. May be it will be a good to cache it in the associationMappings array (by functions like _validateAndCompleteOneToOneMapping)?

        Show
        Konstantin added a comment - Heh, I was lucky, thanks for pointing it out In any case we still can find this type by the target class. May be it will be a good to cache it in the associationMappings array (by functions like _validateAndCompleteOneToOneMapping)?
        Hide
        Benjamin Eberlei added a comment -

        At that point you still don't have the information since its saved on the related association and we don't access it at this point (otherwise you get a riffling effect and everything is in memory). We could just assume it is PDO::PARAM_STR.

        Show
        Benjamin Eberlei added a comment - At that point you still don't have the information since its saved on the related association and we don't access it at this point (otherwise you get a riffling effect and everything is in memory). We could just assume it is PDO::PARAM_STR.
        Hide
        Guilherme Blanco added a comment -

        This issue was fixed in https://github.com/doctrine/doctrine2/commit/63a2f02f4ddea1ab9191b0e4acfd1d790d2247c7

        Thanks for the report and attempting to fix the issue. =)

        Show
        Guilherme Blanco added a comment - This issue was fixed in https://github.com/doctrine/doctrine2/commit/63a2f02f4ddea1ab9191b0e4acfd1d790d2247c7 Thanks for the report and attempting to fix the issue. =)

          People

          • Assignee:
            Guilherme Blanco
            Reporter:
            Konstantin
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: