tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

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();
?>