2011-08-08 13 views
1

複数の挿入/更新が必要なので、何か問題が発生した場合にロールバックするトランザクションを思いつきました。また、私のアプリケーションはレコードがすでに存在する場合は更新し、そうでない場合は挿入します。Codeigniter:mysql transactionとaffected_rows

まず最初にunique_idを使ってレコードを更新しようとしましたが、それがaffected_rows = 0を返すと挿入が続けられます。

おそらく、トランザクション/影響を受けた行の中で何かが間違っていると、それは常にaffected_rows = 0を返します。以下は

コードです:事前に

$this->db->trans_start(); 

    $this->db->where('order_id', $order_id); 
    $this->db->where('order_status', 'Active'); 
    $this->db->update('orders', $order); 

    $this->db->where('order_id', $order_id); 
    $this->db->where('sku', $item_sku); 
    $this->db->update('order_items', $order_items); 

$this->db->trans_complete(); 

if ($this->db->affected_rows()==0){ 
    $this->db->trans_start(); 
     $this->db->insert('orders', $order); 
     $this->db->insert('order_items', $order_items); 
    $this->db->trans_complete(); 
} 

ありがとう!

答えて

2

私はこのケースを処理するためにMySQLのON DUPLICATE KEY UPDATEを使用します。しかし、CodeIgniterのActiveRecordの実装は、ネイティブでこれをサポートしていませんが、このスレッドで受け入れ答え:

How would I use ON DUPLICATE KEY UPDATE in my CodeIgniter model?

は死んでいるように見えます。ですから、ActiveRecordパターンの代わりに生のMySQLを使うことだけを考えてみましょう。これはCI開発者の間ではかなり一般的です(私はARの実装を使用しません)。

+0

あなたの助けを頼りにしてカイル!デッドスレッドは、[link](http://web.archive.org/web/20090221091226/http://codeigniter.com/forums/viewthread/80958/)からアクセスできます。とにかくまっすぐなクエリは、トリックを行うので、私はこのソリューションを使用します!しかし、もし私がそれを必要とするなら、重複したキー更新は、いくつかの行だけで実行されます。例えばWHERE foo = '1'? – Luciano

+1

条件文には手がかりがありません。申し訳ありません。 –