Saving and deleting objects in Corma is very easy. Create your object via createObject(), set call the save() or saveAll() methods on the ObjectMapper to insert or update your objects, call delete() or deleteAll() to delete objects. Unlike Doctrine ORM, everything is executed immediately, there is no flush method.

$object = $orm->createObject(YourDataObject::class);
//Call setters...
$orm->save($object);  //insert
//Call more setters...
$orm->save($object);  //update

//Call more setters on $object...
$objects = [$object];
$newObject = $orm->createObject(YourDataObject::class);
//call setters on $newObject..
$objects[] = $newObject;

$orm->saveAll($objects); //1 update 1 insert
$orm->deleteAll($objects;

Saving Associated Entities

Corma's save() and saveAll() repository methods do not save any associations, so you must override save() in order to save associated entities.

class YourDataObjectRepository extend ObjectRepository 
{
   public function save(DataObjectInterface $object)
   {
      /** @var $object YourDataObject **/
      try {
            $this->db->beginTransaction();
            parent::save($object)

            //save a one-to-many relationship
            $items = $object->getItems();
            foreach($items as $item) {
                $item->setYourDataObjectId($object->getId());
            }
            $this->objectMapper->saveAll($items);

            //save a many-to-many relationship
            if(!empty($object->getAssociatedIds())) {
                $associatedRows = [];
                $this->db->delete('link_table', ['objectId'=>$object->getId()]);
                foreach($user->getAssociatedIds() as $id) {
                    $associatedRows[] = ['objectId'=>$object->getId(), 'roleId'=>$id];
                }
                $this->queryHelper->massInsert('link_table', $associatedRows);
            }

            $this->db->commit();
        } catch(\Exception $e) {
            $this->db->rollBack();
            throw $e;
        }
   }
}

Events

Symfony events are dispatched for every stage of the object lifecycle. ObjectName here is the class without namespace.

  1. DataObject.beforeSave
  2. DataObject.{ObjectName}.beforeSave
  3. DataObject.beforeInsert
  4. DataObject.{ObjectName}.beforeInsert
  5. DataObject.beforeUpdate
  6. DataObject.{ObjectName}.beforeUpdate
  7. DataObject.afterSave
  8. DataObject.{ObjectName}.afterSave
  9. DataObject.afterInsert
  10. DataObject.{ObjectName}.afterInsert
  11. DataObject.afterUpdate
  12. DataObject.{ObjectName}.afterUpdate
  13. DataObject.beforeDelete
  14. DataObject.{ObjectName}.beforeDelete
  15. DataObject.afterDelete
  16. DataObject.{ObjectName}.afterDelete