Пример #1
0
 /**
  * Save entity to database table.
  *
  * @param AbstractDbEntity $dbEntity
  * @return bool
  */
 public function save(AbstractDbEntity $dbEntity)
 {
     if ($dbEntity->shouldBeDeletedFromDbOnSave()) {
         // Only delete if previously saved to db
         if ($dbEntity->getPrimaryDbValue()) {
             $this->delete($dbEntity);
         }
         return false;
     }
     if ($dbEntity->shouldInsertOnDbSave()) {
         // Note that database data always contains all properties, with defaults for non set properties
         $dataToSave = $dbEntity->getDbData();
     } else {
         if ($dbEntity->hasModifiedDbProperties()) {
             $dataToSave = $dbEntity->getModifiedDbData();
         } else {
             // Return if no value has been modified and it's not an insert
             // (we always want to insert if no id exist, since some child objects might
             // depend on the this primary id being available)
             return false;
         }
     }
     // We don't the want to insert/update primary value unless forced insert
     if (!$dbEntity->shouldForceDbInsertOnSave()) {
         $primaryKey = $dbEntity->getPrimaryDbPropertyKey();
         if (is_array($primaryKey)) {
             foreach ($primaryKey as $keyPart) {
                 unset($dataToSave[$keyPart]);
             }
         } else {
             unset($dataToSave[$primaryKey]);
         }
     }
     // Convert & check data
     $sqlData = [];
     foreach ($dataToSave as $propertyName => $value) {
         if ($value && $dbEntity->getDbPropertyMaxLength($propertyName) && mb_strlen($value) > $dbEntity->getDbPropertyMaxLength($propertyName)) {
             throw new \RuntimeException("Database field \"{$propertyName}\" exceeds field max length (value: \"{$value}\")");
         } elseif (empty($value) && $dbEntity->getDbPropertyNonEmpty($propertyName)) {
             throw new \RuntimeException("Database field \"{$propertyName}\" is empty and required");
         } elseif ((string) $value === '' && $dbEntity->getDbPropertyRequired($propertyName)) {
             throw new \RuntimeException("Database field \"{$propertyName}\" is required to be set");
         }
         // Set data keys db field format
         $fieldName = $dbEntity->getDbFieldName($propertyName);
         $sqlData[$fieldName] = $value;
     }
     // Insert new database row
     if ($dbEntity->shouldInsertOnDbSave()) {
         $this->db->insert($dbEntity->getDbTableName(), $sqlData);
         if (!is_array($dbEntity->getPrimaryDbPropertyKey()) && !empty($lastInsertId = $this->db->getLastInsertId())) {
             $dbEntity->setPrimaryDbValue($lastInsertId);
         }
         // Update existing database row
     } else {
         $this->db->update($dbEntity->getDbTableName(), $sqlData, $this->getPrimaryKeyWhereSql($dbEntity), $this->getPrimaryKeyWhereParameters($dbEntity));
     }
     $dbEntity->clearModifiedDbProperties();
     $dbEntity->setForceDbInsertOnSave(false);
     return true;
 }