New DB->upsert_record() proposal

New DB->upsert_record() proposal

by Petr Skoda -
Number of replies: 1
Picture of Core developers Picture of Documentation writers Picture of Particularly helpful Moodlers Picture of Peer reviewers Picture of 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.

Average of ratings: -
In reply to Petr Skoda

New DB->upsert_record() proposal

by Petr Skoda -
Picture of Core developers Picture of Documentation writers Picture of Particularly helpful Moodlers Picture of Peer reviewers Picture of 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;
            }
        }
    }