/** * @param array $data * @param bool $deep * @param bool $mapVirtualFields */ public function fromArray(array $data, $deep = true, $mapVirtualFields = false) { $exists = isset($data[self::FROM_ARRAY_EXISTS_KEY]) && $data[self::FROM_ARRAY_EXISTS_KEY] === true; $relationReferences = array(); foreach ($data as $name => $value) { if ($this->_table->hasField($name)) { $this->set($name, $value); } else { if ($this->_table->hasRelation($name)) { if ($deep) { $relationReferences[$name] = $value; } } else { if ($mapVirtualFields) { $this->mapValue($name, $value); } } } } if ($exists) { $this->_exists = true; $this->refresh(); } if ($relationReferences) { $this->setRelatedFromArray($relationReferences, $mapVirtualFields); } }
/** * @param Table $table * @param string $relationName * @return bool|\Dive\Relation\Relation */ private function getOneToOneRelation(Table $table, $relationName) { if ($relationName && $table->hasRelation($relationName)) { $relation = $table->getRelation($relationName); if ($relation->isOneToOne()) { return $relation; } } return false; }
/** * Saves record * * @param Table $table * @param array $row * @param string $key * @return string */ private function saveRecord(Table $table, array $row, $key) { $tableName = $table->getTableName(); if ($key && $this->isInRecordMap($tableName, $key)) { return $this->getRecordIdFromMap($tableName, $key); } // keep foreign key relations in array to process after record has been saved $owningRelations = array(); $beforeSaveGeneratedRecords = $this->generatedRecords; $this->generatedRecords = array(); foreach ($row as $relationName => $value) { if ($table->hasRelation($relationName)) { $relation = $table->getRelation($relationName); if ($relation->isReferencedSide($relationName)) { $row = $this->saveRecordOnReferencedRelation($row, $relation, $value); } else { $owningRelations[$relationName] = array('related' => $value, 'relation' => $relation); } unset($row[$relationName]); } } $row = $this->saveRequiredRelations($table, $row); // save record $row = $this->fieldValueGenerator->getRandomRecordData($table->getFields(), $row); $record = $this->rm->getOrCreateRecord($tableName, $row); $this->rm->scheduleSave($record); $this->rm->commit(); // keep record identifier in the record map $id = $record->getIdentifierAsString(); if ($key !== null) { $this->recordAliasIdMap[$tableName][$key] = $id; } $this->generatedRecords = array_merge($beforeSaveGeneratedRecords, array(array('tableName' => $tableName, 'id' => $id)), $this->generatedRecords); // save owning relations foreach ($owningRelations as $relationData) { /** @var $relation Relation */ $relation = $relationData['relation']; $relatedRows = $relationData['related']; $this->saveRecordsOnOwningRelation($relation, $relatedRows, $id); } return $id; }