2011-09-24 9 views

risposta

9

Dai un'occhiata alla funzione db_merge(), penso che abbia le funzionalità che stai cercando.

1

Se davvero non si sa se c'è già un record, probabilmente è necessario controllare un po 'prima nel flusso del programma. Normalmente avvierei la funzione o qualsiasi altra cosa con una chiamata al DB e se non ottengo un oggetto record esistente, ne creo uno nuovo da stdClass.

Questo ha due vantaggi: in primo luogo, significa che si conoscono i dati esistenti, quindi è possibile utilizzarli se necessario e non sovrascriverli alla cieca. Secondo: quando si arriva al punto in cui si scrive nel DB, si sa se è INSERT o UPDATE in base al fatto che l'oggetto abbia una proprietà id.

+0

io ogni volta generare record con due chiavi primarie (nessuno è incremento automatico), quindi non posso controllare record senza prova nel DB. Penso che il modo più semplice sia provare per prima cosa a cancellare e inserire. Ma ho paura del tavolo in testa ... – neworld

+0

Intendi una chiave composta? Questo non farà la differenza per il metodo che ho delineato. Basta fare un SELECT * con quella combinazione di campi in una clausola WHERE e vedere cosa ritorna. Ci sono altri campi nella tabella oltre a quelli che stai usando per la chiave (cioè questa è una tabella di join molti-a-molti)? –

+0

Ho una query semplice. Quindi scrivo io stesso la funzione universale, perché ne ho bisogno spesso. – neworld

1

ho implementato la funzione di me:

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); 
} 
Problemi correlati