3

これは本質的に CakePHP と同じ質問です: Is it possible to insert record with pre-defined primary key value? . CakePHP 1.2 では、あらかじめ決められた ID を持つレコードを挿入したいと考えています。IDの値は外部システムによって決定されますが、リンクされた質問とは異なり、私はそのシステムを制御できないため、その質問の解決策は私にとって選択肢ではありません.

を呼び出すときにモデルの id フィールドが設定されている場合$model->save()、Cake は常にレコードを更新しようとします。falseその ID を持つレコードがまだ存在しない場合、Cake は ID を に設定します [1]:

<?php
function save($data = null, $validate = true, $fieldList = array()) {
    // snip
    if (!$this->__exists && $count > 0) {
        $this->id = false;
    }
    // snip
}

最初にモデルを保存してから id を手動で更新することもオプションではありません。これは、参照整合性が損なわれるためです (これは、私が制御できないアーキテクチャ上の制限です)。

では、特定の主キーを持つレコードを強制的に CakePHP に挿入させるにはどうすればよいでしょうか?

私が直面している問題の背景:

私が取り組んでいるアプリケーションは Postgres データベースに支えられているため、新しい主キーはシーケンスによって決定されます。外部システムがSELECT nextval('my_model_sequence')その ID を使用していくつかの作業を行い、それを CakePHP アプリケーションに渡すプロセスがあり、そこでその ID をINSERT持つ my_model レコードが必要です。

レコードを保存した後、外部プロセスを呼び出す方法がありません。外部プロセスを変更する方法もまったくありません。


[1] http://api12.cakephp.org/view_source/model/#l-1260

4

1 に答える 1

10

特定の ID を持つレコードを作成する場合は、必ず ID フィールドに入力してください

   $this->data['ModelName']['id'] = $your_id;

また、電話する前に:

    $this->save($this->data);

電話することを忘れないでください

$this->create();

これにより、モデルの状態がリセットされ、新しいレコードを作成できます。最後に、次のことを試してください。

   $this->ModelName->create(); 
   $this->ModelName->save($this->data);

一方、あなたの投稿を読んでテーブル構造を想像しようとしているとき、id フィールドをそのままにして、この外部 ID を外部キーにすることを検討することをお勧めします。それはあなたのためのオプションですか?

于 2012-09-24T12:03:31.313 に答える