Bisakah beberapa catatan dimasukkan sekaligus dengan jDatabase?

11

Alih-alih menggunakan loop, dapatkah fungsi basis data Joomla membuat pernyataan SQL seperti ini?

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

Dokumen di Mengakses database menggunakan JDatabase , merujuk ke Transaksi dan menggunakan SQL atau Objek, tetapi tidak menyebutkan beberapa nilai dalam kedua kasus.

PDB
sumber

Jawaban:

12

Ini dapat dicapai dengan menggunakan ->insert()dan ->values(), dengan $valuesmenjadi array dari string dengan kolom yang akan disisipkan.

$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 yang diproduksi menggunakan echo $query->dump()

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

Inti Joomla mendukung permintaan SQL dasar. Anda bisa membuat kelas untuk menyimpan beberapa sisipan dan membuat kueri akhir tunggal untuk mengeksekusi sisipan tunggal di akhir.

    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();
}
Anibal
sumber
0

Menambahkan ke jawaban @ 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);
...
Mohd Abdul Mujib
sumber
Bisakah Anda menjelaskan nilai dalam jawaban Anda yang belum dicakup oleh jawaban yang diterima @ GDP? Ini hampir merupakan jawaban hanya kode.
mickmackusa
Ini menunjukkan bagaimana mengisi $valuesvariabel dengan array yang comma separated row stringsterprogram, yang menghemat banyak waktu dan memiliki margin yang lebih rendah untuk kesalahan, daripada secara manual membuat string yang dipisahkan koma seperti dalam jawabannya atau bahkan menyatukan dalam hal ini.
Mohd Abdul Mujib
Informasi ini harus dikemas ke dalam jawaban Anda sehingga dapat mendidik peneliti masa depan.
mickmackusa
Yah seperti yang saya lihat, kode yang disediakan cukup jelas, meskipun pasti ada area perbaikan, jika Anda berpikir demikian, silakan mengedit dan meningkatkan jawabannya
Mohd Abdul Mujib
Kode Anda cukup jelas bagi mereka yang mengerti apa arti sintaks php / Joomla. Anda tidak suka memperbaiki pekerjaan Anda sendiri? Di BEJ (lebih dari Stackoverflow) jawaban yang sepenuhnya menjelaskan adalah sangat penting karena orang-orang yang baru memulai karir dalam pengembangan web tertarik untuk melakukannya oleh CMS. Anda menyadari bahwa maksud dari memposting konten di sini adalah untuk mendidik, bukan? Maksud saya, saya mendorong Anda untuk mengirim jawaban terbaik Anda dan risiko mendapatkan jawaban.
mickmackusa