2011-04-08 140 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(); 

希望這可以節省您的時間。謝謝。快樂的編碼! :)