Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-1939

Trying to save ManyToMany relatrionship

    Details

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

      Description

      When i try to save a many to many relationship i have to following error

      Fatal error: Call to a member function getOwner() on a non-object in Doctrine/ORM/Persisters/ManyToManyPersister.php on line 181

      It tries to call getOwner on the following array ($mapping)

      array(19) {
      ["fieldName"] => string(10) "privileges"
      ["joinTable"] => array(4) {
      ["name"] => string(36) "fsbackend.user_mch_account_privilege"
      ["schema"] => NULL
      ["joinColumns"] => array(2) {
      [0] => array(6)

      { ["name"] => string(13) "mch_accountid" ["referencedColumnName"] => string(13) "mch_accountid" ["unique"] => bool(false) ["nullable"] => bool(true) ["onDelete"] => NULL ["columnDefinition"] => NULL }

      [1] => array(6)

      { ["name"] => string(3) "uid" ["referencedColumnName"] => string(3) "uid" ["unique"] => bool(false) ["nullable"] => bool(true) ["onDelete"] => NULL ["columnDefinition"] => NULL }

      }
      ["inverseJoinColumns"] => array(1) {
      [0] => array(6)

      { ["name"] => string(10) "resourceid" ["referencedColumnName"] => string(10) "resourceid" ["unique"] => bool(false) ["nullable"] => bool(true) ["onDelete"] => NULL ["columnDefinition"] => NULL }

      }
      }
      ["targetEntity"] => string(21) "Entity\User\Privilege"
      ["mappedBy"] => NULL
      ["inversedBy"] => NULL
      ["cascade"] => array(0) {
      }
      ["indexBy"] => string(10) "resourceid"
      ["fetch"] => int(2)
      ["type"] => int(8)
      ["isOwningSide"] => bool(true)
      ["sourceEntity"] => string(26) "Entity\Merchant\Membership"
      ["isCascadeRemove"] => bool(false)
      ["isCascadePersist"] => bool(false)
      ["isCascadeRefresh"] => bool(false)
      ["isCascadeMerge"] => bool(false)
      ["isCascadeDetach"] => bool(false)
      ["relationToSourceKeyColumns"] => array(2)

      { ["mch_accountid"] => string(13) "mch_accountid" ["uid"] => string(3) "uid" }

      ["joinTableColumns"] => array(3)

      { [0] => string(13) "mch_accountid" [1] => string(3) "uid" [2] => string(10) "resourceid" }

      ["relationToTargetKeyColumns"] => array(1)

      { ["resourceid"] => string(10) "resourceid" }

      }

      1. UserAccount.php
        0.6 kB
        Jeremie Tom tom
      2. Privileges.php
        0.3 kB
        Jeremie Tom tom
      3. Membership.php
        0.9 kB
        Jeremie Tom tom

        Activity

        Hide
        Marco Pivetta added a comment -

        Can you try to replace your cache with an `ArrayCache` and see if the problem may come from there?
        It would also be interesting to see your bootstrap code and the code you use to interact with the collection.

        Show
        Marco Pivetta added a comment - Can you try to replace your cache with an `ArrayCache` and see if the problem may come from there? It would also be interesting to see your bootstrap code and the code you use to interact with the collection.
        Hide
        Jeremie Tom tom added a comment - - edited

        I'm already using an ArrayCache for my cache.

        Also for my bootstrap I'm using this implementation of it : https://github.com/guilhermeblanco/ZendFramework1-Doctrine2.

        Here is how i interact with the collection.

        $collection->clear();
        foreach ($values as $value) {
        $collection->add(
        $this->_em->getReference(
        'Entity\User\Privilege',
        $value
        ));}

        ... Later on ...
        ... I have an entity $userAccount with many memberships set to Cascade persist, ....
        ... and on the membership entity relationship i have my collection ...

        $this->_em->persist($userAccount);
        $this->_em->flush();

        Show
        Jeremie Tom tom added a comment - - edited I'm already using an ArrayCache for my cache. Also for my bootstrap I'm using this implementation of it : https://github.com/guilhermeblanco/ZendFramework1-Doctrine2 . Here is how i interact with the collection. $collection->clear(); foreach ($values as $value) { $collection->add( $this->_em->getReference( 'Entity\User\Privilege', $value )); } ... Later on ... ... I have an entity $userAccount with many memberships set to Cascade persist, .... ... and on the membership entity relationship i have my collection ... $this->_em->persist($userAccount); $this->_em->flush();
        Hide
        Jeremie Tom tom added a comment -

        I don't know if it helps but it works if I replace $mapping with $coll on line 181 :

        $sourceClass = $this->_em->getClassMetadata(get_class($mapping->getOwner()));

        Replaced by :

        $sourceClass = $this->_em->getClassMetadata(get_class($coll->getOwner()));

        Show
        Jeremie Tom tom added a comment - I don't know if it helps but it works if I replace $mapping with $coll on line 181 : $sourceClass = $this->_em->getClassMetadata(get_class($mapping->getOwner())); Replaced by : $sourceClass = $this->_em->getClassMetadata(get_class($coll->getOwner()));
        Hide
        Marco Pivetta added a comment -

        Looks like code coming from the (removed) AssociationMapping class. The fix seems also to be valid. I'm patching this.

        Show
        Marco Pivetta added a comment - Looks like code coming from the (removed) AssociationMapping class. The fix seems also to be valid. I'm patching this.
        Hide
        Marco Pivetta added a comment -

        Nevermind, I don't think this needs a test. It is just something overlooked during a refactoring. Being handled at DDC-1941

        Show
        Marco Pivetta added a comment - Nevermind, I don't think this needs a test. It is just something overlooked during a refactoring. Being handled at DDC-1941
        Hide
        Marco Pivetta added a comment -

        Could you please provide the models anyway? It would be interesting to see why the test suite doesn't cover that part
        Thank you!

        Show
        Marco Pivetta added a comment - Could you please provide the models anyway? It would be interesting to see why the test suite doesn't cover that part Thank you!
        Hide
        Jeremie Tom tom added a comment - - edited

        Ok I attached it. Tell me if you need more informations i didn't upload the full models. But just the parts i thought were relevant.

        Show
        Jeremie Tom tom added a comment - - edited Ok I attached it. Tell me if you need more informations i didn't upload the full models. But just the parts i thought were relevant.
        Hide
        Benjamin Eberlei added a comment -

        Fixed and applied to 2.2.3 and 2.3

        Show
        Benjamin Eberlei added a comment - Fixed and applied to 2.2.3 and 2.3

          People

          • Assignee:
            Marco Pivetta
            Reporter:
            Jeremie Tom tom
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: