変更する価値はあると思いますが、おそらく挿入前に選択する価値はありません。
変更されたフィールドのみを更新します。これは、activerecord パターンに従う DbEntity クラスの操作の一部です。現在のレコードと元のレコードを保持しているため、これを行うのに余分な費用はかかりません。レコードがロードされるたびにコピーするだけです。
理由は簡潔であり、実際にはパフォーマンスではありません。また、更新されたフィールドの古い値に where 句を追加して、適切なエラーをスローすることにより、同時変更を確認できます。
書き込み/更新メソッド:
$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);
ロード方法で
$this->orig_record = Array();
foreach ($this->record as $key => $value)
$this->orig_record[$key] = $value;