New DB->upsert_record() proposal

New DB->upsert_record() proposal

Petr Skoda發表於
Number of replies: 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.

評比平均分數: -
In reply to 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;
            }
        }
    }