2011-09-24 7 views
8

同様の探求はここにある:Help with db query in drupal - if exists update else insert唯一つの機能を有するDrupalの挿入または更新DBレコード

しかしdrupal_write_record()第3引数は、更新を決定または挿入することです。おそらく、drupalには別の機能があります。自分自身がプライマリ・キーによる挿入または更新を決定していますか?それとも私は自分自身をプログラムする必要がありますか?

答えて

9

db_merge()関数を見て、私はそれがあなたが探している機能があると思います。

1

既にレコードがあるかどうかわからない場合は、プログラムフローの少し前にチェックする必要があります。通常は、DBへの呼び出しで関数などを起動します。既存のレコードオブジェクトがない場合は、stdClassから新しいレコードオブジェクトを作成します。

これには2つの利点があります。まず、既存のデータを知っていることを意味します。必要に応じて使用し、盲目的に上書きしないでください。 2番目:DBに書き込むポイントに達すると、そのオブジェクトがidプロパティを持っているかどうかに基づいてINSERTかUPDATEかを知ることができます。

+0

私はすべての時間を2つの主キー(誰が自動インクリメントされていない)でレコードを生成するので、私はDB内でテストせずに記録を確認することができません。私は最も簡単な方法は、最初にレコードを削除して挿入しようとしていると思います。しかし、私はテーブルオーバーヘッドを恐れています... – neworld

+0

複合キーを意味しますか?これは、私が概説した方法に違いはありません。 WHERE句のフィールドの組み合わせをSELECT *し、戻ってくるものを見てください。テーブルに、キーに使用しているフィールドとは別のフィールドがありますか(つまり、これは多対多の結合テーブルですか)。 –

+0

私は単純なクエリを持っています。だから私は普遍的な機能を自分で書いています。 – neworld

1

私は、機能を自分で実装:

function drupal_write_record2($table, $data, $primaryKeys) { 
    $data = (array)$data; 

    $query = db_select($table) 
     ->fields($table); 

    if (is_array($primaryKeys)) 
     foreach ($primaryKeys as $key) 
     $query->condition($key, $data[$key]); 
    else 
     $query->condition($primaryKeys, $data[$primaryKeys]); 

    $update = (bool)$query->execute()->fetchAssoc(); 

    if ($update) 
     return drupal_write_record($table, $data, $primaryKeys); 
    else 
     return drupal_write_record($table, $data); 
} 
関連する問題