Doctrine MongoDB ODM
  1. Doctrine MongoDB ODM
  2. MODM-45

Doctrine doesn't persist empty objects

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.0.0BETA1
    • Component/s: Persister
    • Labels:
      None

      Description

      Doctrine won't persist object if it is empty (all fields are nulls). Not sure if it is bug or expected behavior, but sometimes it causes inconvenience. Test case:

      /** @Document(db="tests", collection="tests") */
      class a
      {
          /** @Id */
          protected $id;
      
          /** @String */
          protected $b;
      }
      
      $a = new a();
      $dm->persist($a);
      $dm->flush(); // $a won't be inserted
      

      There is also related issue: when embedding empty object (all fields are nulls) embedded object is not saved.

      /** @Document(db="tests", collection="tests") */
      class a
      {
          /** @Id */
          protected $id;
      
          /** @String */
          protected $tmp = 'WorkaroundToBeSaved';
      
          /** @EmbedOne(targetDocument="b", cascade="all") */
          protected $b;
      
          function getId()  {return $this->id;}
          function getB()   {return $this->b;}
          function setB($b) {$this->b = $b;}
      }
      
      /** @EmbeddedDocument */
      class b
      {
          /** @String */
          protected $val;
          function setVal($val) {$this->val = $val;}
          function getVal() {return $this->val;}
      }
      
      $a = new a();
      $a->setB(new b());
      
      $dm->persist($a);
      $dm->flush();
      $dm->getUnitOfWork()->clear();
      
      $a = $dm->loadByID('a', $a->getId());
      $c = (null !== $a->getB()); 
      var_dump($c); // returns false, while expecting true
      

        Activity

        Show
        Jonathan H. Wage added a comment - Fixed by http://github.com/doctrine/mongodb-odm/commit/b3a16496c0576e8f926faec9bbcfd5716006273b
        Hide
        Jonathan H. Wage added a comment -

        After a second look we can fix this.

        Show
        Jonathan H. Wage added a comment - After a second look we can fix this.
        Hide
        Jonathan H. Wage added a comment -

        This is expected as well since we never store null values or empty arrays.

        Show
        Jonathan H. Wage added a comment - This is expected as well since we never store null values or empty arrays.
        Hide
        Vladimir Razuvaev added a comment -

        I see now. But second case is still possible with mongo and not supported by ODM:

        $a = new a();
        $a->setB(new b());
        $dm->persist($a);
        $dm->flush($a);
        
        /* expecting:
        {
          "_id": "4c69ff3c0f9d50c80e000000",
          "tmp": "WorkaroundToBeSaved",
          "b" => []
        }
        
        * getting:
        {
          "_id": "4c69ff3c0f9d50c80e000000",
          "tmp": "WorkaroundToBeSaved"
        }
        */
        
        Also, if I remove string "WorkaroundToBeSaved" from $a, it won't be saved with flush, although it is not empty (has $b field set).
        
        Show
        Vladimir Razuvaev added a comment - I see now. But second case is still possible with mongo and not supported by ODM: $a = new a(); $a->setB( new b()); $dm->persist($a); $dm->flush($a); /* expecting: { "_id" : "4c69ff3c0f9d50c80e000000" , "tmp" : "WorkaroundToBeSaved" , "b" => [] } * getting: { "_id" : "4c69ff3c0f9d50c80e000000" , "tmp" : "WorkaroundToBeSaved" } */ Also, if I remove string "WorkaroundToBeSaved" from $a, it won't be saved with flush, although it is not empty (has $b field set).
        Hide
        Jonathan H. Wage added a comment -
        $mongo = new Mongo();
        $doc = array();
        $mongo->dbname->coll->insert($doc);
        

        Causes this error:

        PHP Fatal error:  Uncaught exception 'MongoException' with message 'no elements in doc' in /Users/jwage/Sites/mongodb-odm/test.php:5
        Stack trace:
        #0 /Users/jwage/Sites/mongodb-odm/test.php(5): MongoCollection->insert(Array)
        #1 {main}
          thrown in /Users/jwage/Sites/mongodb-odm/test.php on line 5
        
        MongoException: no elements in doc in /Users/jwage/Sites/mongodb-odm/test.php on line 5
        
        Call Stack:
            0.0004     320216   1. {main}() /Users/jwage/Sites/mongodb-odm/test.php:0
            0.0037     322036   2. MongoCollection->insert() /Users/jwage/Sites/mongodb-odm/test.php:5
        
        Show
        Jonathan H. Wage added a comment - $mongo = new Mongo(); $doc = array(); $mongo->dbname->coll->insert($doc); Causes this error: PHP Fatal error: Uncaught exception 'MongoException' with message 'no elements in doc' in /Users/jwage/Sites/mongodb-odm/test.php:5 Stack trace: #0 /Users/jwage/Sites/mongodb-odm/test.php(5): MongoCollection->insert(Array) #1 {main} thrown in /Users/jwage/Sites/mongodb-odm/test.php on line 5 MongoException: no elements in doc in /Users/jwage/Sites/mongodb-odm/test.php on line 5 Call Stack: 0.0004 320216 1. {main}() /Users/jwage/Sites/mongodb-odm/test.php:0 0.0037 322036 2. MongoCollection->insert() /Users/jwage/Sites/mongodb-odm/test.php:5
        Hide
        Jonathan H. Wage added a comment -

        Mongo won't let you insert empty documents, so we can't allow it.

        Show
        Jonathan H. Wage added a comment - Mongo won't let you insert empty documents, so we can't allow it.

          People

          • Assignee:
            Jonathan H. Wage
            Reporter:
            Vladimir Razuvaev
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: