/** * @param \Enjoin\Record\Record $Record * @param array|null $params * @param int $flags * @return \Enjoin\Record\Record */ public static function save(Record $Record, array $params = null, $flags = 0) { $scope = $Record->scope(); $Model = Enjoin::get($scope->modelName); if ($Model->isTimestamps()) { $createdAtField = $Model->getCreatedAtField(); if ($scope->type === self::NON_PERSISTENT || $scope->type === self::PERSISTENT && !isset($Record->{$createdAtField})) { $Record->{$createdAtField} = Carbon::now(); } $updatedAtField = $Model->getUpdatedAtField(); $Record->{$updatedAtField} = Carbon::now(); } $defAttributes = $Model->getDefinition()->getAttributes(); $pick = isset($params['fields']) ? $params['fields'] : null; $volume = []; $validate = []; $record = $Record->__toArray(); $Setters = Factory::getSetters(); foreach ($Record as $field => $recordVal) { if ($recordVal instanceof Record) { # We can start recursive saving here... #$recordVal->save(); } elseif (array_key_exists($field, $defAttributes)) { $saveVal = $Setters->perform($Model, $record, $defAttributes[$field], $field); if (isset($defAttributes[$field]['validate'])) { $validate[] = [$field, $saveVal, $defAttributes[$field]['validate']]; } if (!$pick || in_array($field, $pick)) { $volume[$field] = $saveVal; } } elseif ($Model->isTimestamps() && $field === $createdAtField) { if (!$pick || in_array($field, $pick)) { $volume[$field] = $Setters->getCreatedAt($Model, $recordVal); } } elseif ($Model->isTimestamps() && $field === $updatedAtField) { $volume[$field] = $Setters->getUpdatedAt($Model, $recordVal); } } !$validate ?: $Setters->validate($validate); if (!($flags & self::SOFT_SAVE)) { // $id = $this->saveEntry($volume); $id = $scope->type === self::NON_PERSISTENT ? static::saveNonPersistent($Record, $volume) : static::savePersistent($Record, $volume); $scope->id = $id; $Record->id = $id; } return $Record; }