[MODM-45] Doctrine doesn't persist empty objects Created: 16/Aug/10  Updated: 17/Aug/10  Resolved: 17/Aug/10

Status: Resolved
Project: Doctrine MongoDB ODM
Component/s: Persister
Affects Version/s: None
Fix Version/s: 1.0.0BETA1

Type: Bug Priority: Major
Reporter: Vladimir Razuvaev Assignee: Jonathan H. Wage
Resolution: Fixed Votes: 0
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


 Comments   
Comment by Jonathan H. Wage [ 16/Aug/10 ]

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

Comment by Jonathan H. Wage [ 16/Aug/10 ]
$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
Comment by Vladimir Razuvaev [ 16/Aug/10 ]

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).
Comment by Jonathan H. Wage [ 17/Aug/10 ]

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

Comment by Jonathan H. Wage [ 17/Aug/10 ]

After a second look we can fix this.

Comment by Jonathan H. Wage [ 17/Aug/10 ]

Fixed by http://github.com/doctrine/mongodb-odm/commit/b3a16496c0576e8f926faec9bbcfd5716006273b

Generated at Sat Nov 29 02:29:58 UTC 2014 using JIRA 6.2.3#6260-sha1:63ef1d6dac3f4f4d7db4c1effd405ba38ccdc558.