Kohana 3 ORM — Как узнать, является ли текущая сохраняемая модель новой?

В моей модели ORM я хотел бы сохранить некоторые значения по умолчанию, которые рассчитываются на основе других значений. Лучшее, что я мог придумать, это:

function save(){
    if( ! $this->loaded()){
        // Set values here
    }
    parent::save();
}

Кто-нибудь знает, есть ли лучший/рекомендуемый способ сделать это, или этого должно быть достаточно для большинства случаев? Спасибо :)


person Jordan    schedule 22.11.2010    source источник


Ответы (2)


Ваша реализация хороша. Единственное улучшение, которое вы можете сделать, это просто заменить ваше условие на:

if (!$this->_loaded) {
person zerkms    schedule 22.11.2010
comment
Спасибо! Возможно, это слишком педантично, но есть ли причина, по которой лучше использовать защищенный «_loaded», а не «loaded()» более высокого уровня? Или просто вопрос предпочтения аккуратности кода? - person Jordan; 22.11.2010
comment
@jord: посмотрите на первые строки в методе Kohana_ORM::__call(). Есть просто бесполезная (в вашем случае) работа. - person zerkms; 22.11.2010

Это очень хороший вопрос.

К сожалению, только ваш способ возможен.

Ниже функция ORM::create(), которая вызывается из ORM::save().

public function create(Validation $validation = NULL)
{
  if ($this->_loaded)
    throw new Kohana_Exception('Cannot create :model model because it is already loaded.', array(':model' => $this->_object_name));

  // Require model validation before saving
  if ( ! $this->_valid OR $validation)
  {
    $this->check($validation);
  }

  $data = array();
  foreach ($this->_changed as $column)
  {
    // Generate list of column => values
    $data[$column] = $this->_object[$column];
  }

  if (is_array($this->_created_column))
  {
    // Fill the created column
    $column = $this->_created_column['column'];
    $format = $this->_created_column['format'];

    $data[$column] = $this->_object[$column] = ($format === TRUE) ? time() : date($format);
  }

  $result = DB::insert($this->_table_name)
  ->columns(array_keys($data))
  ->values(array_values($data))
  ->execute($this->_db);

  if ( ! array_key_exists($this->_primary_key, $data))
  {
    // Load the insert id as the primary key if it was left out
    $this->_object[$this->_primary_key] = $this->_primary_key_value = $result[0];
  }
  else
  {
    $this->_primary_key_value = $this->_object[$this->_primary_key];
  }

  // Object is now loaded and saved
  $this->_loaded = $this->_saved = TRUE;

  // All changes have been saved
  $this->_changed = array();
  $this->_original_values = $this->_object;

  return $this;
}

Как видите, значений по умолчанию нет...

person Николай Лубышев    schedule 08.12.2014