Example #1
0
 /**
  * {@inheritDoc}
  * @todo    Optimize the changeset to query generation.
  */
 public function update(Model $model)
 {
     $metadata = $model->getMetadata();
     $criteria = $this->getRetrieveCritiera($metadata, $model->getId());
     $changeset = $model->getChangeSet();
     $update = [];
     foreach ($changeset['attributes'] as $key => $values) {
         if (null === $values['new']) {
             $op = '$unset';
             $value = 1;
         } else {
             $op = '$set';
             $value = $this->prepareAttribute($metadata->getAttribute($key), $values['new']);
         }
         $update[$op][$key] = $value;
     }
     // @todo Must prevent inverse relationships from persisting
     foreach ($changeset['hasOne'] as $key => $values) {
         if (null === $values['new']) {
             $op = '$unset';
             $value = 1;
         } else {
             $op = '$set';
             $value = $this->prepareHasOne($metadata->getRelationship($key), $values['new']);
         }
         $update[$op][$key] = $value;
     }
     foreach ($changeset['hasMany'] as $key => $values) {
         if (null === $values['new']) {
             $op = '$unset';
             $value = 1;
         } else {
             $op = '$set';
             $value = $this->prepareHasMany($metadata->getRelationship($key), $values['new']);
         }
         $update[$op][$key] = $value;
     }
     if (empty($update)) {
         return $model;
     }
     $this->createQueryBuilder($metadata)->update()->setQueryArray($criteria)->setNewObj($update)->getQuery()->execute();
     return $model;
 }