3

私はCakePHP 1.3を使用しています。新しいレコード(数〜数千)が新しい場合はループに挿入し、既存のレコードが既に存在する場合は更新しています。しかし、私が保存している方法は、レコードが既に存在するかどうかをチェックしません。代わりに、各レコードに主キー値を割り当てます。私が割り当てるこの ID は一意であることが保証されています。CakePHP は、この ID が存在しない場合は挿入し、存在しない場合は更新することを知っているようです。

ただし、正しい方法で行っているかどうかはわかりません。ループで新しいレコードを作成している場合は、ここを読みます。実行する必要があります。これは、各レコードが一意になることがわかっている他の関数で実装します。エラーなしで動作するように見えるため、ここでは行いません。また、各レコードの存在を確認する必要もありません。$this->create()

挿入または更新する各レコード配列にはid、それぞれのテーブルの主キーを示すキーがあり、各配列には適切に関連付けられた 2 つのモデルのデータが含まれています。

例えば

$this->saveAll($myData);

Array
(
    [MyModel] => Array
    (
        [id] => 123
        [xyz] => ...
        ...
    )
    [MySecondModel] => Array
    (
        [id] => 789
        [my_model_id] => 123
        [qwe] => ...
        ...
    )
)

私がやっていることはうまくいっていますか、それとも存在を確認し、必要に応じて を実行$this->create()する必要がありますか?

4

1 に答える 1

3

SQL デバッグを有効にすると、 の前に ID を指定すると、Cake がデータベースからレコードをフェッチすることがわかりますsave()。レコードが存在する場合、Cake は更新を実行し、そうでない場合は挿入します。ID に NULL を指定すると、挿入が強制されます。だからあなたがしていることは問題ありません。

create()すべての列を埋めていない場合、これは重要です。そうしないと、データがオブジェクトに残り、あるレコードから別のレコードにデータがこぼれることになります。create内部データ構造をリセットするだけです。

save()本当に妄想的でない限り、の後にデータの存在を確認する必要はありません。ただし、からの結果を確認してくださいsave()。false を返す場合は、何か問題が発生しています。

于 2013-07-19T19:34:34.393 に答える