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コアは基本的な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構文の意味を理解している人には自明です。自分の仕事を洗練したくないですか?JSX(Stackoverflow以上)では、Web開発でキャリアを始めたばかりの人々がCMSからそうするように誘われているため、答えを完全に説明することは非常に重要です。ここにコンテンツを投稿することは教育することだと気づいていますか?つまり、ベストアンサーとリスク獲得投票を投稿することをお勧めします。
mickmackusa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.