Drupal вставка или обновление записи БД только с одной функцией - PullRequest
8 голосов
/ 24 сентября 2011

похожий квест здесь: Помощь с запросом БД в drupal - если обновление существует, вставьте

Но drupal_write_record () Третий аргумент - определение обновления или вставки. Может быть, у drupal есть другая функция, которая самостоятельно определяет вставку или обновление по первичному ключу? Или я должен это запрограммировать себя?

Ответы [ 3 ]

9 голосов
/ 25 сентября 2011

Посмотрите на функцию db_merge () , я думаю, она имеет функции, которые вы ищете.

1 голос
/ 25 сентября 2011

Я сам реализовал функцию:

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);
}
1 голос
/ 25 сентября 2011

Если вы действительно не знаете, есть ли там запись, вам, вероятно, нужно проверить это немного раньше в процессе выполнения программы.Обычно я начинаю функцию или что-то еще с вызова БД, и если я не получаю существующий объект записи, я создаю новый из stdClass.

Это имеет два преимущества: во-первых, это означает, что вы знаете о существующих данных, поэтому вы можете использовать их при необходимости и не перезаписывать их вслепую.Второе: когда вы достигаете точки записи в БД, вы знаете, является ли она INSERT или UPDATE, в зависимости от того, имеет ли объект свойство id.

...