it-swarm-eu.dev

db_affected_rows in Drupal 7 pro db_query

Jen jsem si všiml, že @ Berdir byl tak pěkný odstranit db_affected_rows Z Drupal 7 . Nyní jsem zvědav, jaký je nejlepší postup pro detekci pokud dotaz, který jste spustili, něco změnil v databázi.

Typický případ použití by byl.

db_query(...);
if (!db_affected_rows()) {
  db_query(...);
}

Podíval jsem se na objekt dotazu vrácený z db_query, ale nezdálo se, že by mi hodně pomohl.

Aktualizace:
Vidím, že jsem byl trochu nejasný ohledně toho, za jakých okolností jsem potřeboval informace.

Můj současný případ použití je poměrně jednoduchý. Mám tabulku pro typ uzlu se sloupcem nid a některými datovými sloupci. Mám formulář a po odeslání formuláře chci vložit nebo aktualizovat řádek v db.

Problém s db_update/db_insert Je v tom, že pokud použiju aktualizaci nejprve a vložím, pokud aktualizace vrátí 0, nebudu zachycovat podmínku, ve které byl formulář odeslán s hodnotou v db. Pokud použiji db_insert první, zvýší to en error, pokud již v db existuje řádek.

Předpokládám, že v tomto specifickém stavu mohu vložit prázdnou hodnotu, když je uzel vytvořen, a pak použít pouze aktualizaci, ale v některých případech to nemusí být možné, pokud bych potřeboval uložit informace, které byly vloženy do externí databáze. Chtěl bych se také vyhnout nutnosti záviset na hodnotách databáze, aby můj kód fungoval.

Moje obvyklá strategie pro takové případy bylo udělat

db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
  db_query("UPDATE ...");
}

To je jednoduché i bezchybné, bez ohledu na to, v jakém stavu je db. Nejlepší možností, kterou teď vidím, by bylo zpracovat ji pomocí SQL a udělat toto:

db_query("INSERT ... ON DUPLICATE KEY UPDATE");

Ale doufal jsem, že to API API zvládne.

8
googletorp

Po vykopání jsem zjistil, že Drupal dodává hotový pojmenovaný nástroj pro můj přesný případ použití:

Vložte řádek do db nebo aktualizujte existující, pokud již existuje.

Tomu se říká slučovací dotazy , což lze u některých db motorů provést atomově.

Syntext je celkem jednoduchý:

db_merge('example')
  ->key(array('name' => $name))
  ->fields(array(
    'field1' => $value1,
    'field2' => $value2,
))
->execute();
8
googletorp

Tyto informace jsou přímo vráceny metodou execute () v nástroji Delete/UpdateQuery, viz například: pdateQuery :: execute () .

<?php
$affected = db_update('some_table')
  ->fields(array(
    'some_field' => $value,
  ))
  ->condition('another_field', $id)
  ->execute();
?>

A InsertQuery :: execute () vrátí poslední ID vložení.

9
Berdir