2010-11-22 4 views
2

In meinem ORM-Modell möchte ich einige Standardwerte speichern, die auf anderen Werten basieren. Das Beste, was ich tun konnte, ist:Kohana 3 ORM - Wie kann ich feststellen, ob das aktuelle Modell neu ist?

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

Weiß jemand, ob es ein besserer/empfohlene Weg, dies zu tun, oder sollte dies für die meisten Fälle ausreichend sein? Danke :)

Antwort

2

Ihre Implementierung ist gut. Die einzige Verbesserung, die Sie tun könnten, ist nur ersetzen Sie Ihre Bedingung zu:

if (!$this->_loaded) { 
+0

Dank! Vielleicht ist das zu pedantisch, aber gibt es irgendeinen Grund, warum es besser ist, geschütztes '_loaded' als das höhere Level 'loaded()' zu verwenden? Oder nur eine Frage der Code-Ordnungspräferenz? – Jordan

+0

@jord: Sehen Sie sich die ersten Zeilen in 'Kohana_ORM :: __ call()' Methode an. Es gibt nur eine nutzlose (in Ihrem Fall) Arbeit. – zerkms

+0

Ah ich verstehe. Vielen Dank! – Jordan

1

Es ist eine sehr gute Frage.

Leider ist Ihr Weg nur möglich.

Unter ORM :: create() Funktion, die von ORM :: save() aufgerufen wurde.

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; 
} 

Wie Sie sehen können, gibt es keine defaut Werte ...

Verwandte Themen