New DB->upsert_record() proposal

New DB->upsert_record() proposal

Petr Skoda -
回帖数:1
Core developers的头像 Documentation writers的头像 Particularly helpful Moodlers的头像 Peer reviewers的头像 Plugin developers的头像

Hi devs,

do you think it would be nice to include new DML method that inserts or updates existing record like this?

$preference = new stdClass();
$preference->userid = $user->id;
$preference->name = $name;
$preference->value = $value;
$DB->upsert_record('user_preferences', $preference, ['userid', 'name']); 

See https://tracker.moodle.org/browse/MDL-85353 for more details and patch.

回复Petr Skoda

New DB->upsert_record() proposal

Petr Skoda -
Core developers的头像 Documentation writers的头像 Particularly helpful Moodlers的头像 Peer reviewers的头像 Plugin developers的头像
ooops, forgot to include original code for comparison:

    $retry = 0;
    $saved = false;

    while (!$saved && $retry++ < 2) {
        if ($preference = $DB->get_record('user_preferences', ['userid' => $user->id, 'name' => $name])) {
            if ($preference->value === $value && isset($user->preference[$name]) && $user->preference[$name] === $value) {
                // Preference already set to this value.
                return true;
            }
            $DB->set_field('user_preferences', 'value', $value, ['id' => $preference->id]);
            $saved = true;
        } else {
            $preference = new stdClass();
            $preference->userid = $user->id;
            $preference->name   = $name;
            $preference->value  = $value;
            try {
                $DB->insert_record('user_preferences', $preference);
                $saved = true;
            } catch (dml_write_exception $e) {
                // We have an insert race, so just ignore and try again.
                $saved = false;
            }
        }
    }