สามารถแทรกหลายระเบียนพร้อมกันทั้งหมดด้วย jDatabase ได้หรือไม่?


11

แทนที่จะใช้การวนซ้ำฟังก์ชันฐานข้อมูล Joomla สามารถสร้างคำสั่ง SQL เช่นนี้ได้หรือไม่?

INSERT INTO #__tablename (col1,col2)
VALUES 
 ('1', 'one'),
 ('2', 'two'),
 ('3', 'three'),
...
 ('999', 'three'),

เอกสารที่เข้าถึงฐานข้อมูลโดยใช้ JDatabaseอ้างถึงธุรกรรมและการใช้ SQL หรือวัตถุ แต่ไม่มีการกล่าวถึงหลายค่าในกรณีใดกรณีหนึ่ง

คำตอบ:


12

สิ่งนี้สามารถทำได้โดยใช้->insert()และ->values()ด้วย$valuesการเป็นอาร์เรย์ของสตริงที่มีคอลัมน์ที่จะแทรก

$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 ที่ผลิตโดยใช้ echo $query->dump()

INSERT INTO `xyz_tablename`
(col_one,col_two) VALUES 
(1, "one"),(2, "two"),(3, "three),(999, "nineninetynine")

3

Joomla core สนับสนุนการสืบค้น SQL พื้นฐาน คุณสามารถสร้างคลาสเพื่อเก็บแทรกหลาย ๆ อันและสร้างคิวรีสุดท้ายเพื่อเรียกใช้การแทรกเดี่ยวในตอนท้าย

    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

กำลังเพิ่มคำตอบของ @ 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);
...

คุณช่วยอธิบายคุณค่าของคำตอบที่ไม่ได้รับการยอมรับโดย @ GDP ได้หรือไม่? นี่เป็นคำตอบสำหรับโค้ดอย่างเดียวเท่านั้น
mickmackusa

มันแสดงให้เห็นถึงวิธีการเติม$valuesตัวแปรด้วยอาร์เรย์ของcomma separated row stringsโปรแกรมซึ่งช่วยประหยัดเวลาได้มากและมีระยะขอบที่ต่ำกว่าสำหรับข้อผิดพลาดแทนที่จะสร้างสตริงที่คั่นด้วยเครื่องหมายจุลภาคด้วยตนเองเช่นเดียวกับในคำตอบของเขา
Mohd Abdul Mujib

ข้อมูลนี้ควรบรรจุไว้ในคำตอบของคุณเพื่อให้ความรู้แก่นักวิจัยในอนาคต
mickmackusa

วิธีที่ฉันเห็นก็คือรหัสที่ให้นั้นเป็นคำอธิบายที่ค่อนข้างดี แต่แน่นอนว่าอาจมีการปรับปรุงหากคุณคิดเช่นนั้นโปรดแก้ไขและปรับปรุงคำตอบ
Mohd Abdul Mujib

รหัสของคุณอธิบายตนเองสำหรับผู้ที่เข้าใจว่า php / Joomla syntax หมายถึงอะไร คุณไม่ชอบที่จะปรับแต่งการทำงานของคุณเอง? ใน JSX (มากกว่า Stackoverflow) การอธิบายคำตอบอย่างเต็มที่นั้นสำคัญมากเพราะผู้ที่เพิ่งเริ่มต้นอาชีพในการพัฒนาเว็บนั้นได้รับการชักจูงจาก CMS คุณตระหนักดีว่าจุดโพสต์เนื้อหาที่นี่คือเพื่อให้ความรู้ใช่ไหม ฉันหมายถึงฉันขอแนะนำให้คุณโพสต์คำตอบที่ดีที่สุดและเสี่ยงต่อการได้ upvotes
mickmackusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.