/** * {@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; }