Myślę, że warto to zmienić - ale prawdopodobnie nie warto robić wyboru przed wstawieniem.
Aktualizuję tylko te pola, które uległy zmianie, jest to część operacji mojej klasy DbEntity, która jest zgodna ze wzorcem activerecord. Kosztuje to niewiele więcej, ponieważ trzymam bieżący rekord i oryginalne rekordy - po prostu kopiuję za każdym razem, gdy rekord jest ładowany.
Powodem jest zwięzłość, a nie wydajność. Możesz również sprawdzić współbieżną modyfikację, dodając klauzulę where do starej wartości zaktualizowanych pól i zgłaszając odpowiedni błąd.
W metodzie zapisu/aktualizacji:
$s1 = "";
foreach ($this->record as $key => $value)
{
// only update fields that have been changed
if ($value != $this->orig_record[$key])
{
$s1 .= $comma."`$key`='".mysql_real_escape_string($value)."'";
$comma = ", ";
}
}
$query = "UPDATE ".$this->table." SET $s1 where {$this->id_field}='".$this->get_keyfield()."'";
$query .= $this->extra_sql_update;
mysql_query($query);
$ar = mysql_affected_rows();
//
// the number of affected rows is actually those changed by the update operation, which will
// either be zero, or 1. If the query affects more than one row then we have a problem.
if ($ar < 0 || $ar > 1)
{
cbf_error("cbf_dbentity: {$this->table} :: only one row (not $ar) must be affected by an insert operation. $query",
E_USER_ERROR);
}
else
{
$new_id = $this->get_keyfield();
GlobalEventBus::notify_all(new AuditLogSQL($this->table, "update", $query));
}
$this->orig_record = Array();
foreach ($this->record as $key => $value)
$this->orig_record[$key] = $value;
//
// sanity check - ensure that what we have just written is actually there.
$this->load($new_id);
foreach ($this->orig_record as $key => $value)
if (trim($this->record[$key]) != trim($value)
&& (!$this->record[$key] == "0" && $value=""))
cbf_error("cbf_dbentity: {$this->table} :: record differs during write after reload: field $key was \"$value\", after write it is now \"".
$this->record[$key]."\"",E_USER_ERROR);
W metodzie ładowania
$this->orig_record = Array();
foreach ($this->record as $key => $value)
$this->orig_record[$key] = $value;