function update()
{
$args = [];
$ctr = 0;
$pairs = '';
$filter = '';
$pkeys = [];
foreach ($this->fields as $key => $field) {
if ($field['pkey']) {
$pkeys[$key] = $field['previous'];
}
}
if (isset($this->trigger['beforeupdate']) && \Base::instance()->call($this->trigger['beforeupdate'], [$this, $pkeys]) === FALSE) {
return $this;
}
foreach ($this->fields as $key => $field) {
if ($field['changed']) {
$pairs .= ($pairs ? ',' : '') . $this->db->quotekey($key) . '=?';
$args[++$ctr] = [$field['value'], $field['pdo_type']];
}
}
foreach ($this->fields as $key => $field) {
if ($field['pkey']) {
$filter .= ($filter ? ' AND ' : ' WHERE ') . $this->db->quotekey($key) . '=?';
$args[++$ctr] = [$field['previous'], $field['pdo_type']];
}
}
if ($pairs) {
$sql = 'UPDATE ' . $this->table . ' SET ' . $pairs . $filter;
$this->db->exec($sql, $args);
if (isset($this->trigger['afterupdate'])) {
\Base::instance()->call($this->trigger['afterupdate'], [$this, $pkeys]);
}
}
// reset changed flag after calling afterupdate
foreach ($this->fields as $key => &$field) {
$field['changed'] = FALSE;
$field['initial'] = $field['value'];
unset($field);
}
return $this;
}