tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Komplikovanější dotaz – správné řešení v dibi?

před 10 lety

maarlin
Člen | 207

Ahoj,
mám následující dotaz:

INSERT IGNORE INTO shop
        (product_id, name, category_id)
    VALUES
        ('25', 'Apple', '5')
    ON DUPLICATE KEY
        UPDATE name='Pear', category_id = '5'

Jak by šel takový dotaz napsat v dibi?
Ideálně za použití všech jeho výhod… předání celého pole pro insert i update, místo zdlouhavého vypisování všech klíčů a hodnot a zároveň jejich escapování a vůbec jistota, že se předá vše „bezpečně“.

před 10 lety

David Grudl
Nette Core | 6806
$update = array('name' => 'Pear', category_id => 5);
$insert = array('product_id' => 25, name => 'Apple', category_id => 5);

dibi::query('INSERT IGNORE INTO shop ', $insert, 'ON DUPLICATE KEY UPDATE %a', $update);

Pokud UPDATE větev nemá tak odlišné hodnoty než INSERT, šlo by udělat

$update = array('name' => 'Pear', category_id => 5);

dibi::query('INSERT IGNORE INTO shop ', $update + array('product_id' => 25), 'ON DUPLICATE KEY UPDATE %a', $update);

před 10 lety

pta
Člen | 11

Ahoj, nez se pustim do vlastniho reseni, chci vedet, jestli dibi podporuje nasledujici formu zapisu s ON DUPLICATE KEY UPDATE:

INSERT INTO
    tabulka (id, col1, col2, col3)
VALUES
    (1, 'a', 'b', 'c')
ON DUPLICATE KEY UPDATE
    col1 = VALUES(col1),
    col2 = VALUES(col2),
    col3 = VALUES(col3)

Sloupec ID je v tomto pripade unikatni klic, ktery pri konfliktu spousti update a je v UPDATE casti vynechan. V podstate mi jde o to, aby vstupem bylo pole podobne jako pri pouziti %m a nic vic. Tzn. muselo by dojit ke zjisteni sloupcu, ktere jsou pouzite jako unikatni klice a ty vynechat v UPDATE casti query. Momentalne to resim jako

$data = array(
    'id' => array(1,2,3),
    'col1' => array('a1','b1','c1'),
    ...
    'col3' => array('a3','b3','c3'),
);

dibi::query(
    'INSERT INTO tabulka %m', $data,
    'ON DUPLICATE KEY UPDATE
        col1 = VALUES(col1),
        ...
        col3 = VALUES(col3)
    '
);

coz funguje hezky, ale jen pro presny pocet sloupcu. Jde mi o to, abych do pole $data mohl dat treba jen sloupec id a col3.

pta

Editoval pta (25. 11. 2009 11:45)

před 9 lety

prema
Člen | 14

Preji pekny vecer.

Chtel bych se zeptat, jak napsat dibi dotaz a volani z presenteru pro update vice radku.

Toto mi nejede :-(

Presenter:

CategoryModel::updateCategory(
    $data = array(
        'id' => array(1,2,3),
        'col1' => array('cid' => 1, 'name' => 'cat 1'),
        'col2' => array('cid' => 2, 'name' => 'cat 2'),
        'col3' => array('cid' => 3, 'name' => 'cat 3')
    )
);

Model:

public static function updateCategory($data = NULL){
    dibi::query("INSERT IGNORE INTO [categories] ", $data, "ON DUPLICATE KEY UPDATE %a", $data);
}

Diky Prema

před 9 lety

phx
Člen | 652

Pouzij dibi::test() at vidis vysledek co se posila do DB a odlad si ten dotaz jen ciste v SQL. Pak to zkus napasovat do Dibi.

Zkus rozsirit to nejde. Hazi to chybu, nebo to nic neudela?