Có thể chèn nhiều bản ghi cùng một lúc với jDatabase không?


11

Thay vì sử dụng một vòng lặp, các hàm cơ sở dữ liệu Joomla có thể tạo một câu lệnh SQL như thế này không?

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

Các tài liệu tại Truy cập cơ sở dữ liệu bằng JDatabase , tham khảo Giao dịch và sử dụng SQL hoặc Đối tượng, nhưng không đề cập đến nhiều giá trị trong cả hai trường hợp.

Câu trả lời:


12

Điều này có thể được thực hiện bằng cách sử dụng ->insert()->values(), với việc $valueslà một mảng của các chuỗi với các cột cần chèn.

$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 được tạo bằng cách sử dụng echo $query->dump()

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

3

Joomla lõi hỗ trợ các truy vấn SQL cơ bản. Bạn có thể tạo một lớp để lưu trữ một số chèn và tạo một truy vấn cuối cùng để thực hiện một lần chèn vào cuối.

    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

Thêm vào câu trả lời của @ 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);
...

Bạn có thể giải thích giá trị trong câu trả lời của bạn chưa được bao phủ bởi câu trả lời được chấp nhận của @ GDP không? Đây là gần như một câu trả lời chỉ mã.
mickmackusa

Nó chỉ ra cách điền vào $valuesbiến với một mảng comma separated row stringslập trình, giúp tiết kiệm rất nhiều thời gian và có sai số thấp hơn, thay vì tự tạo các chuỗi được phân tách bằng dấu phẩy như trong câu trả lời của mình hoặc thậm chí ghép nối cho vấn đề đó.
Mohd Abdul Mujib

Thông tin này nên được đóng gói vào câu trả lời của bạn để nó có thể giáo dục các nhà nghiên cứu trong tương lai.
mickmackusa

Vâng, theo cách tôi thấy, mã được cung cấp khá tự giải thích, mặc dù chắc chắn có thể có các lĩnh vực cải thiện, nếu bạn nghĩ vậy xin vui lòng chỉnh sửa và nâng cao câu trả lời
Mohd Abdul Mujib

Mã của bạn là tự giải thích cho những người hiểu cú pháp php / Joomla nghĩa là gì. Bạn không muốn tinh chỉnh công việc của riêng bạn? Trên JSX (hơn cả Stackoverflow) giải thích đầy đủ các câu trả lời là rất quan trọng bởi vì những người mới bắt đầu sự nghiệp phát triển web bị dụ dỗ làm như vậy bởi CMS. Bạn có nhận ra rằng quan điểm của việc đăng nội dung ở đây là để giáo dục, phải không? Ý tôi là, tôi khuyến khích bạn đăng câu trả lời tốt nhất của bạn và có nguy cơ kiếm được tiền.
mickmackusa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.