0

Cakephpのsaveallを使用してデータベースに保存される配列があります。最近、配列に約100の値のセットがあり、これを保存するために100の挿入クエリが実行されていることに気付きました。これはトランザクションとして実行され、後でコミットされます。各クエリには約1ミリ秒かかります。したがって、100個のクエリは多くの時間を合計します。1つのクエリでこれを行う方法がいくつかあると確信しています。

私は試した

$this->User->savemany($data)

しかし、変化はありません。

このようなものを保存できる他の方法はありますか

INSERT INTO users (ID, Value)

VALUES(1、'First')、(2、'Second')、(3、'Third');

ありがとうございました

4

1 に答える 1

1

いいえ、カスタムSQLを使用したり、AppModelを拡張したりせずにこれを実現する方法はありません。そのためINSERT、特定の状況で最適化されたステートメントを実行するメソッドがあります。****

モデルのデータをすべて単独で保存するとは限らないことに注意してください。関連するオブジェクトを保存している場合があります。

例:Person hasMany CarPersonそれぞれが任意の数の(s)を持つ複数のを保存する場合Car、CakePHPは、データベース内のCarレコードを関連付ける前に、保存された各PersonレコードのIDを取得する必要があります。

私が言ったように、AppModelを拡張し、saveAllメソッドを拡張して、保存されているデータの構造を検査し、作成したカスタムメソッドにフックして、必要な処理を実行することができますが、おそらくさらに追加されるでしょう。 saveAllメソッドのオーバーヘッドは価値があります。

**多くのカスタムコーディングなしで実行できる最善の最適化は、saveAllをトランザクションでラップすることです。これにより、それぞれを初期化してコミットする必要がなくなります。例:

$this->Model->begin();
$this->Model->saveAll(data);
$this->Model->commit();
于 2012-12-05T18:10:34.587 に答える