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'),
La documentation à Accès à la base de données à l'aide de JDatabase , reportez-vous à Transactions et à l'aide de SQL ou d'objets, mais aucune mention de valeurs multiples dans les deux cas.
Ceci peut être accompli en utilisant ->insert()
et ->values()
, avec le $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")
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();
}
Ajouter à 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);
...