Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před rokem

Skic
Člen
Registrovaný: 14. 5. 2006
Příspěvky: 11

UPSERT a feature request pro novy modifikator

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)

 

#2 před rokem

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5563

Re: UPSERT a feature request pro novy modifikator

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.

 

Zápatí