protected function _processSave($entity, $options)
{
$primaryColumns = (array) $this->primaryKey();
if ($options['checkExisting'] && $primaryColumns && $entity->isNew() && $entity->has($primaryColumns)) {
$alias = $this->alias();
$conditions = [];
foreach ($entity->extract($primaryColumns) as $k => $v) {
$conditions["{$alias}.{$k}"] = $v;
}
$entity->isNew(!$this->exists($conditions));
}
$mode = $entity->isNew() ? RulesChecker::CREATE : RulesChecker::UPDATE;
if ($options['checkRules'] && !$this->checkRules($entity, $mode, $options)) {
return false;
}
$options['associated'] = $this->_associations->normalizeKeys($options['associated']);
$event = $this->dispatchEvent('Model.beforeSave', compact('entity', 'options'));
if ($event->isStopped()) {
return $event->result;
}
$saved = $this->_associations->saveParents($this, $entity, $options['associated'], ['_primary' => false] + $options->getArrayCopy());
if (!$saved && $options['atomic']) {
return false;
}
$data = $entity->extract($this->schema()->columns(), true);
$isNew = $entity->isNew();
if ($isNew) {
$success = $this->_insert($entity, $data);
} else {
$success = $this->_update($entity, $data);
}
if ($success) {
$success = $this->_onSaveSuccess($entity, $options);
}
if (!$success && $isNew) {
$entity->unsetProperty($this->primaryKey());
$entity->isNew(true);
}
return $success ? $entity : false;
}