Czy jDatabase może wstawiać wiele rekordów jednocześnie?

11

Czy zamiast używać pętli, funkcje bazy danych Joomla mogą tworzyć takie instrukcje SQL?

INSERT INTO #__tablename (col1,col2)
VALUES 
 ('1', 'one'),
 ('2', 'two'),
 ('3', 'three'),
...
 ('999', 'three'),

Dokumenty w temacie Uzyskiwanie dostępu do bazy danych za pomocą JDatabase odnoszą się do Transakcji i używania SQL lub Obiektów, ale w żadnym przypadku nie wspominają o wielu wartościach.

PKB
źródło

Odpowiedzi:

12

Można to osiągnąć za pomocą ->insert()i ->values(), ponieważ $valuesjest to tablica ciągów z kolumnami do wstawienia.

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$columns = array('col_one','col_two');
$values = array();
// Proper escaping/quotes should be done here, and probably in a loop, but cluttered the answer, so omitted it
$values[] = '1, "one"';
$values[] = '2, "two"';
$values[] = '3, "three"';
$values[] = '999, "nineninetynine"';

$query->insert($db->quoteName('#__tablename'));
$query->columns($columns);
$query->values($values);
$db->setQuery($query);
$db->query();

SQL tworzony przy użyciu echo $query->dump()

INSERT INTO `xyz_tablename`
(col_one,col_two) VALUES 
(1, "one"),(2, "two"),(3, "three),(999, "nineninetynine")
PKB
źródło
3

Rdzeń Joomla obsługuje podstawowe zapytania SQL. Możesz utworzyć klasę do przechowywania kilku wstawek i utworzyć jedno końcowe zapytanie w celu wykonania pojedynczej wstawki na końcu.

    public function flushInserts()
{
    $db = JFactory::getDbo();

    foreach ($this->bulk_tables as $table)
    {
        // No inserts
        if (!array_key_exists($table, $this->bulk_inserts))
        {
            continue;
        }

        $tableq = $db->qn($table);

        $insertSet = $this->bulk_inserts[$table];
        $values = implode(',', $insertSet);
        $query = 'INSERT INTO ' . $tableq . ' VALUES ' . $values . ';';

        $db->setQuery($query);
        $db->execute();

        if ($error = $db->getErrorMsg())
        {
            throw new Exception($error);
        }
    }

    $this->bulk_inserts = array();
}
Anibal
źródło
0

Dodanie do odpowiedzi @ GDP

...
$columns = array('user_id', 'type', 'object', 'lvl', 'date');
$values  = array();
foreach ($batch as $row) {
    $array    = array(
        $row->user_id,
        $db->quote($row->type),
        $db->quote($row->object),
        $db->quote($row->lvl),
        $db->quote($row->date),
    );
    $values[] = implode(',', $array);
}
$query->insert($db->quoteName('#__activity_log'));
$query->columns($db->quoteName($columns));
$query->values($values);
...
Mohd Abdul Mujib
źródło
Czy możesz wyjaśnić wartość w swojej odpowiedzi, która nie jest jeszcze uwzględniona w zaakceptowanej odpowiedzi @ GDP? To prawie odpowiedź tylko na kod.
mickmackusa
Pokazuje, jak wypełnić $valueszmienną tablicą comma separated row stringsprogramowo, co oszczędza dużo czasu i ma mniejszy margines błędów, niż ręczne tworzenie ciągów oddzielonych przecinkami, jak w jego odpowiedzi, a nawet konkatenacja w tej sprawie.
Mohd Abdul Mujib
Informacje te należy umieścić w odpowiedzi, aby mogły one edukować przyszłych badaczy.
mickmackusa
Cóż, tak jak widzę, pod warunkiem, że kod jest dość oczywisty, choć z pewnością mogą istnieć obszary wymagające poprawy, jeśli tak uważasz, nie krępuj się edytować i poprawić odpowiedź
Mohd Abdul Mujib
Twój kod jest zrozumiały dla tych, którzy rozumieją, co oznacza składnia php / Joomla. Nie lubisz dopracowywać swojej pracy? W JSX (więcej niż Stackoverflow) pełne wyjaśnienie jest bardzo ważne, ponieważ osoby, które dopiero rozpoczynają karierę w tworzeniu stron internetowych, są do tego zachęcane przez CMS. Zdajesz sobie sprawę, że celem zamieszczania treści jest edukacja, prawda? Mam na myśli, że zachęcam cię do opublikowania najlepszej odpowiedzi i zaryzykowania zdobywania głosów pozytywnych.
mickmackusa