Oznámení
INSERT vice zaznamu najednou
před 10 lety
- onge
- Člen | 53
Je mozne nejak rozume zapsat vlozeni vice radku? Tj. neco jako INSERT INTO table (col1, col2) VALUES (val1a, val2a), (val1b, val2b)? Delat nejaky foreach a skladat z toho string mi prijde dost krkolomne, na druhou stranu poustet kazdy dotaz zvlast je spousta zbytecne komunikace.
Umi tohle dibi nejak snadno?
před 10 lety
- skocourek
- Generous Backer | 180
Určitě umí. Zhruba takto
<?php
$values[] = array('col1' => 'val1', 'col2' => 'val2');
...
...
$values[] = array('col1' => 'val1', 'col2' => 'val2');
dibi::query('INSERT INTO [table] %ex', $values);
?>
před 10 lety
- matata
- Backer | 672
zdravim, k tomuto bych mel reseni, pridanim nekolika radku do DibiTranslator.php kolem radku 270 to usadit do SWITCH
<?php
case 'm'://multi insert
foreach ($value as $k => $v) {
$pair = explode('%', $k, 2); // split into identifier & modifier
$kx[] = $this->delimite($pair[0]);
$column =count($v);
if(!isset($columnBefore))
{
$columnBefore =$column;
}
else if($columnBefore != $column)
{
throw new InvalidStateException('This column "'. $k .'" has not same number of rows as another columns.');
}
foreach((array)$v as $kvx => $vvx)
{
if(isset($vx[$kvx]))
{
$vx[$kvx] .=', '. $this->formatValue($vvx, isset($pair[1]) ? $pair[1] : FALSE);
}
else
{
$vx[$kvx] = $this->formatValue($vvx, isset($pair[1]) ? $pair[1] : FALSE);
}
}
}
return '(' . implode(', ', $kx) . ') VALUES (' . implode('), (', $vx) . ')';
?>
zapis:
<?php
dibi::connect(array(
'driver' => 'mysql',
'host' => 'localhost',
'username' => 'xxx',
'password' => 'xxx',
'database' => 'test',
'charset' => 'utf8',
));
//vyhoda tohoto definovaneho pole ze udrzujete jeden nazev sloupce v klici pole
$id =array(
'id' =>array(1, 2, 3, 4),
'text' =>array('ahoj', 'jak', 'se', 'mas'),
);
//oproti vlastnimu sestaveni dotazu INSERT INTO test (`id`, `text`) VALUES (1, 'ahoj'), (2, 'jak'), (3, 'se'), (4, 'mas'), tak pres toto definovani kazda polozka prochazi validaci, lze je overovat i na typy
dibi::query('INSERT INTO test %m', $id);//%m modifikator pro multi -> funguje take pro REPLACE
?>
co se tim ziska?
INSERT INTO test (id
, text
) VALUES (1,
‚ahoj‘), (2, ‚jak‘), (3, ‚se‘), (4, ‚mas‘)
Editoval matata (30. 6. 2009 11:01)
před 10 lety
- David Grudl
- Nette Core | 6806
matata napsal(a):
//vyhoda tohoto definovaneho pole ze udrzujete jeden nazev sloupce v klici pole
$id =array(
‚id‘ =>array(1, 2, 3, 4),
‚text‘ =>array(‚ahoj‘, ‚jak‘, ‚se‘, ‚mas‘),
);
Máš to tam ;)
před 10 lety
- matata
- Backer | 672
Super, diky Davide.
před 9 lety
- redhead
- Člen | 1315
Jak toto můžu použít s DibiFluent? Nevím kam dát ten modifikátor %ex (případně %m) a toto nefunguje
<?php
$array = array();
foreach($values as $val) {
$array[] = array('answer' => $val, 'poll_id' => $pollId);
}
dibi::insert('poll_answers', $array)->execute();
?>