Zend_Dbが複数行の挿入をサポートしているとは思いません。
ただし、行が2つ以上ある場合は、ループを使用できます。
foreach ($data as $row)
{
$db->insert('table', $row)
}
ビル・カーウィン 、元Zend Framework開発者は、これは少し前のNabbleで :
行セットは基本的にコレクションオブジェクトであるため、そのクラスにメソッドを追加して、行をセットに追加できるようにします。したがって、これを実行できるはずです:
// creates a rowset collection with zero rows
$rowset = $table->createRowset();
// creates one row with unset values
$row = $table->createRow();
// adds one row to the rowset
$rowset->addRow($row);
// iterates over the set of rows, calling save() on each row
$rowset->save();
createRowset()に整数を渡してN個の空の行を作成することは意味がありません。とにかく値を入力するには、それらを反復処理する必要があります。したがって、ループを作成して個々の行を作成し、アプリケーションデータを入力してから、それらをコレクションに追加することもできます。
$rowset = $table->createRowset();
foreach ($appData as $tuple)
{
$row = $table->createRow($tuple);
$rowset->addRow($row);
}
$rowset->save();
配列の配列をcreateRowset()に渡すことを許可することは理にかなっています。これは、タプルをcreateRow()に渡す使用法と一致するためです。
$rowset = $table->createRowset($appData); // pass array of tuples
これにより、上記の前の例と同じループが実行され(最後のsave()を除く)、save()dの準備ができた新しい行の新しい行セットが作成されます。
SQLには、データ挿入の効率を向上させる2つの方法があります。
-
複数の行を持つ単一のINSERTステートメントを使用します:
INSERT INTO t(col1、col2、col3)VALUES(1、2、3)、(4、5、6)、(7、8、9);
-
INSERTステートメントを準備し、それを複数回実行します:
PREPARE INSERT INTO t(col1、col2、col3)VALUES(?、?、?); EXECUTE 1、2、3EXECUTE 4、5、6EXECUTE 7、8、9
ただし、これらの改善のいずれかをサポートすると、RowクラスとRowsetクラスが複雑になります。これは、現在のZend_Db_Table_Rowクラスが、save()を呼び出すときにINSERTまたはUPDATEが必要な行を区別する内部的な方法によるものです。この区別はRowオブジェクトによってカプセル化されるため、Rowsetは、個々の行が新しい行であるか、既存の行の変更されたコピーであるかを認識しません。したがって、Rowsetクラスがより効率的なSQLを使用する複数行のsave()メソッドを提供するには、ダーティデータの管理を完全にリファクタリングする必要があります。より簡単な解決策は、行セットがその行を反復処理し、各行でsave()を呼び出すことです。これは、行セットを挿入するためのSQLの最適化には役立ちませんが、OOカプセル化には適しています。
いずれにせよ、効率的なSQLが最も必要な場合、通常のWebリクエストで多くの行のデータを一括ロードすることは非常にまれです。少数の行の効率の違いは小さいため、大量の行を一括ロードする場合にのみ、顕著な改善が見られます。その場合は、とにかくINSERTを使用しないでください。また、MySQLのLOAD DATAステートメントを使用するか、別のRDBMSブランドを使用する場合は同等の機能を使用する必要があります。 INSERTは通常、大量のデータをロードするための最も効率的な選択ではありません。
自動生成されたキーを返すことに関しては、私は気にしません。プレーンSQLを使用し(たとえば、mysql CLIで)、単一のINSERTステートメントに複数の行を挿入する場合、挿入されたすべての行のID値ではなく、最後に生成されたID値のみを取得できることに注意してください。これはSQLの動作です。これは、どの言語やフレームワークにも当てはまります。
INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple
各行のIDが必要な場合は、ループを作成して行を1つずつ挿入し、各行が挿入された後に生成されたIDを取得する必要があります。