yakamara / yform

YForm für REDAXO 5 – Formulare im Frontend und Backend mit Verwaltung von Datenbank-Tabellen.
MIT License
77 stars 55 forks source link

YOrm: äquivalent zu "ON DUPLICATE UPDATE" in rex_sql - `saveOrInsert()` #1081

Closed alxndr-w closed 2 years ago

alxndr-w commented 3 years ago

Ich benötige zur Synchronisation von Datensätzen die Möglichkeit, einen Datensatz automatisch zu erstellen, wenn er noch nicht existiert. Dazu müssten ein oder mehrere Unique-Felder in der Validierung berücksichtigt werden.

Aktuell muss ich jeden Datensatz erstmal über findOne() auf Existenz prüfen und dann wahlweise diesen bearbeiten oder einen neuen anlegen.

    $entry =  event_date::query()->Where('uid', $product->sid)->findOne();

    if (!$entry) {
        $entry = event_date::create();
    }

    $entry
        ->setValue('uid', $product->sid)
        ->setValue('artist', $product->title)
        ->setValue('name', $product->supertitle ." ".$product->subtitle)
        ->setValue('startDate', $product->valid_start_on)
        ->setValue('endDate', $product->valid_end_on)
        ->setValue('doorTime', substr($product->time_open, 0, 5).":00")
        ->setValue('startTime', substr($product->time_begin, 0, 5).":00")
        ->setValue('endTime', substr($product->time_begin, 0, 5).":00")
        ->setValue('teaser', $product->subtitle)
        ->setValue('description', $product->description)
        ->setValue('createuser', "cronjob")
        ->setValue('updateuser', "cronjob")
        ->setValue('url', "")
        ->setValue('eventStatus', $product->status)
        ->setValue('image', $fileName)
        ->setValue('location', $location->id);

    if (!$entry->save()) {
        echo implode('<br>', $entry->getMessages());
    }
alxndr-w commented 2 years ago

Mit dem Ansatz von oben könnte das dann in etwa so lauten für master/plugins/manager/lib/yform/manager/dataset.php

    public static function createOrEdit($field, $value) {
        $dataset = self::query()->Where($field, $value)->findOne();

    if (!$dataset) {
        $dataset = self::create();
    }

        return $dataset;
    }

Ob man's aber auch erst beim Speichern überprüfen kann - keine Ahnung.

Wenn's nicht benötigt wird, dann eben schließen oder in die Doku verfrachten.

dergel commented 2 years ago

In die Doku fände ich passend. Hast du Zeit dafür? Wenn nein, kannst du es meinetwegen auch gerne schließen. Hier sammelt sich einfach zu viel Zeugs :)