tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

UPSERT a feature request pro novy modifikator

před 9 lety

Skic
Člen | 18

Jak vypada SQL upsert dotaz:

INSERT INTO `tbl`  (`id`, `text`, `desc`) VALUES (1, 'h', 'hh') , (2, 'g', 'gg')
ON DUPLICATE KEY UPDATE `text`=VALUES(`text`), `desc`=VALUES(`desc`)

Pole dat pro dibi s vice radky zaznamu, ktere se pro multi INSERT expanduje modifikatorem %ex

$data = array(
    array('id' => 1, 'text' => "h", 'desc' => "hh"),
    array('id' => 2, 'text' => "g", 'desc' => "gg"),
);

dibi::query('INSERT INTO [tbl] %ex', $data);

Pro upsert bych si predstavoval takovyto dotaz na dibi s novym modifikatorem „%ev“:

dibi::query('INSERT INTO [tbl] %ex, ', $data, ' ON DUPLICATE KEY UPDATE %ev', $data);

Modifikator by expandoval klice z prvni polozky dat do podoby viz. ukazka sql [zdrojovy kod c.1];

DibiTranslator.php (okolo radku 300):

case 'ev':
    $cols = array_keys($value[0]);
        foreach ($cols as &$col) {
            $col = "{$this->delimite($col)}=VALUES({$this->delimite($col)})";
        }
        return implode(',', $cols);

Nebo mozna nechat na uzivateli vyjmenovani polozek pro update:

dibi::query('INSERT INTO [tbl] %ex, ', $data, ' ON DUPLICATE KEY UPDATE %ev', array_keys($data[0]));

A patricne zmenena implementace modifikatoru…

Editoval Skic (30. 7. 2010 22:19)

před 9 lety

David Grudl
Nette Core | 6806

To by mohlo být užitečné. Jen začíná být trošku zmatek v modifikátorech. %ev asi není ideální.

Ještě to chce domyslet, jak vybrat všechny ty klíče s výjimkou id.