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.

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")

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

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);
...

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.