2011-04-08 142 views
8

Joomla的DB对象可以一次添加多行吗? MySQL可以这样做:使用单个查询插入多行

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

但Joomla自己的函数可以在单个查询中实现相同的功能吗?目前我正在做一个循环来将每行(同一个表)插入到单独的查询中。在处理大量行时不是一个好主意。

+2

你如何插入Joomla? – Gaurav 2011-04-08 06:59:47

+0

'$ this-> store($ data,'tablename')' - 使用Jtable实例 – exentric 2011-04-08 07:25:04

回答

7

在你的模型,你可以这样做:

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

如果您是模型之外,你需要得到数据库对象,像这样:

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

是的这就是我所做的。问题是,我必须为INSERT和UPDATE执行两个单独的查询。使用JTable实例,它将根据PRIMARY KEY的存在情况自动选择。 – exentric 2011-04-08 13:07:34

+0

我以为你说你必须做2个单独的查询INSERT和UPDATE。那么为什么JTable必须选择?当然,它也需要同时执行INSERT和UPDATE,除非你没有提到你想要做的事情。 – Martin 2011-04-12 08:07:53

2

你不需要$db = $this->getDBO();

只使用这个: -

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

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

您可以使用:

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

$db->insertId()可以回到你AUTOINC ID,如果你有一个。

+0

我已经更正了使用$ query-> columns,$ query-> values进行测试的答案,因为它最初是错误的。 – 2012-09-26 08:28:34

+0

这个效果很好,除非你在1000行上试用它,那么我宁愿将Martin的解决方案建议在效率上面。 – 2015-07-17 12:20:12

2

尝试这种情况:

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

“值”的方法的描述

添加一个元组,或将被用作值的INSERT INTO语句元组的阵列。
用法:
$ query-> values('1,2,3') - > values('4,5,6');
$ query-> values(array('1,2,3','4,5,6'));

5

试试这个,如果你在一个数组有值:

$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

在的Joomla的最新版本,你可以用它自己的DB类,如下所示。请记住根据需要使用'quoteName'和'quote'函数。

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

希望这可以节省您的时间。谢谢。快乐的编码! :)