Oznámení
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?