Peut-on insérer plusieurs enregistrements à la fois avec la jDatabase?

11

Au lieu d'utiliser une boucle, les fonctions de base de données Joomla peuvent-elles créer une instruction SQL comme celle-ci?

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

Les documents sur Accès à la base de données à l'aide de JDatabase , font référence aux transactions et à l'utilisation de SQL ou d'objets, mais aucune mention de plusieurs valeurs dans les deux cas.

PIB
la source

Réponses:

12

Cela peut être accompli en utilisant ->insert()et ->values(), avec $valuesétant un tableau des chaînes avec les colonnes à insérer.

$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 produit à l'aide de echo $query->dump()

INSERT INTO `xyz_tablename`
(col_one,col_two) VALUES 
(1, "one"),(2, "two"),(3, "three),(999, "nineninetynine")
PIB
la source
3

Joomla core prend en charge les requêtes SQL de base. Vous pouvez créer une classe pour stocker plusieurs insertions et créer une seule requête finale pour exécuter une seule insertion à la fin.

    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
la source
0

Compléter la réponse de @ 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
la source
Pouvez-vous expliquer la valeur de votre réponse qui n'est pas déjà couverte par la réponse acceptée de @ GDP? Il s'agit presque d'une réponse uniquement codée.
mickmackusa
Il montre comment remplir la $valuesvariable avec un tableau de comma separated row stringsprogrammation, ce qui économise beaucoup de temps et a une marge d'erreur inférieure, plutôt que de créer manuellement les chaînes séparées par des virgules comme dans sa réponse ou même de concaténer d'ailleurs.
Mohd Abdul Mujib
Ces informations doivent être intégrées à votre réponse afin de pouvoir éduquer les futurs chercheurs.
mickmackusa
Eh bien, selon moi, le code est assez explicite, bien qu'il puisse y avoir des améliorations, si vous le pensez, n'hésitez pas à modifier et à améliorer la réponse
Mohd Abdul Mujib
Votre code est explicite pour ceux qui comprennent ce que signifie la syntaxe php / Joomla. Vous n'aimez pas affiner votre propre travail? Sur JSX (plus que Stackoverflow), l'explication complète des réponses est méga-importante car les personnes qui commencent tout juste une carrière dans le développement Web sont incitées à le faire par CMS. Vous vous rendez compte que le but de publier du contenu ici est d'éduquer, non? Je veux dire, je vous encourage à poster votre meilleure réponse et à risquer de gagner des votes.
mickmackusa