2011-04-08 42 views
8

¿Puede el objeto DB de Joomla agregar varias filas a la vez? MySQL puede hacer esto así:Insertar varias filas con una sola consulta

INSERT INTO x (a,b) 
VALUES 
('1', 'one'), 
('2', 'two'), 
('3', 'three') 

Pero, ¿pueden las funciones propias de Joomla lograr lo mismo en una sola consulta? Actualmente estoy haciendo un ciclo para insertar cada fila (misma tabla) en una consulta separada. No es una buena idea cuando se trata de toneladas de filas a la vez.

+2

¿Cómo lo estás insertando en Joomla? – Gaurav

+0

'$ this-> store ($ data, 'tablename')' - usando la instancia de Jtable – exentric

Respuesta

7

En el modelo se puede hacer esto:

$db = $this->getDBO(); 
$query = " 
    INSERT INTO x (a,b) 
    VALUES 
    ('1', 'one'), 
    ('2', 'two'), 
    ('3', 'three') 
"; 
$db->setQuery($query); 
$db->query(); 

Si se encuentra fuera de su modelo que necesita para obtener el objeto DB así:

$db = JFactory::getDBO(); 
+0

Sí, esto es lo que hice. El problema es que tengo que hacer dos consultas separadas para INSERT y UPDATE. Con la instancia JTable, elegirá automáticamente dependiendo de la presencia de PRIMARY KEY. – exentric

+0

Pensé que había dicho que tenía que hacer 2 consultas separadas INSERTAR y ACTUALIZAR. Entonces, ¿por qué JTable tendría que elegir? Seguramente también necesitaría hacer INSERTAR y ACTUALIZAR también, a menos que haya algo que no haya mencionado acerca de lo que quiere hacer. – Martin

2

No es necesario $db = $this->getDBO();

simplemente use esto: -

$query = " 
    INSERT INTO x (a,b) 
    VALUES 
    ('1', 'one'), 
    ('2', 'two'), 
    ('3', 'three') 
"; 

$this->_db->setQuery($query); 
$this->_db->query(); 
5

Se puede utilizar:

$db = JFactory::getDbo(); 
$query = $db->getQuery(true); // !important, true for every new query 

$query->insert('#__table_name'); // #__table_name = databse prefix + table name 
$query->set('`1`="one"'); 
$query->set('`2`="two"'); 
$query->set('`3`="three"'); 
/* or something like this: 
$query->columns('`1`,`2`,`3`'); 
$query->values('"one","two","three"'); 
*/ 

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

y $db->insertId() puede regresar Identificación AutoInc si tiene uno.

+0

He corregido la respuesta probada con $ query-> columns, $ query-> values, ya que inicialmente era incorrecta. –

+0

Esto funciona muy bien, excepto si lo prueba en miles de filas, entonces prefiero sugerir la solución de Martin para la eficiencia. –

2

Prueba esto:

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

$query->insert('x'); 
$query->columns('a,b'); 
$query->values('1', 'one'); 
$query->values('2', 'two'); 
$query->values('3', 'three'); 

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

Una descripción de "valores" método

Añade una tupla, o matriz de tuplas que serían utilizadas como valores para un INSERT INTO.
Uso:
$ query-> values ​​('1,2,3') -> values ​​('4,5,6');
$ query-> values ​​(array ('1,2,3', '4,5,6'));

5

Prueba de esto, si tiene valores en una matriz:

$query = $this->db->getQuery(true); 
$query->insert($this->db->quoteName('#__table_name')); 
$query->columns($this->db->quoteName(array('col_1','col_2','col_3','col_4'))); 

for($i=0; $i < lengthOfArray; $i++) 
{ 
    $values= $arr_1[$i].','.$this->db->quote($arr_2[$i]).','.$this->db->quote($arr_3[$i]).','. $arr_4[$i]; 
    $query->values($values); 
} 
$this->db->setQuery($query); 
$result = $this->db->query(); 
2

En última versión de Joomla, puede utilizar su propia clase DB de la siguiente manera. Recuerde utilizar las funciones 'quoteName' y 'quote' según lo necesite.

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

$columns = array('col_one','col_two', 'col_three'); 
$values = array(); 

//if you need, here you can use forloop/foreach loop to populate the array 
$values[] = 'val_1, val_2, val_3'; // first row values 
$values[] = 'val_4, val_5, val_6'; // second row values 
... 

$query->insert($dbo->quoteName('#__table_name')); 
$query->columns($columns); 

$query->values($values); 

$dbo->setQuery($query); 
$dbo->query(); 

Espero que esto le ahorre tiempo. Gracias. Feliz codificación! :)

Cuestiones relacionadas