it-swarm-ko.tech

Drupal 7)의 db_affected_rows

방금 @ Berdir이 Drupal 7 에서 db_affected_rows를 제거하는 것이 좋았습니다. 이제 모범 사례가 무엇인지 감지해야합니다. 실행 한 쿼리가 데이터베이스의 내용을 변경 한 경우.

일반적인 사용 사례는 다음과 같습니다.

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

Db_query에서 반환 된 쿼리 객체를 살펴 보았지만별로 도움이되지는 않았습니다.

업데이트 :
정보가 필요한 상황에 대해 조금 불분명 한 것으로 보입니다.

내 현재 사용 사례는 매우 간단합니다. nid 열과 일부 데이터 열이있는 노드 유형에 대한 테이블이 있습니다. 양식을 제출 할 때 양식이 있고 DB의 행을 삽입하거나 업데이트하고 싶습니다.

db_update/db_insert의 문제점은 먼저 update를 사용하고 update가 0을 반환하면 insert하면 db의 값으로 양식이 제출 된 조건을 포착하지 못한다는 것입니다. db_insert를 먼저 사용하면 이미 db에 행이 있으면 오류가 발생합니다.

이 특정 조건에서 노드를 만들 때 빈 값을 삽입 한 다음 업데이트 만 사용할 수 있지만 외부 데이터베이스에 키가 지정된 정보를 저장 해야하는 경우 불가능한 경우가 있습니다. 또한 코드가 작동하기 위해 데이터베이스 값에 의존하지 않아도됩니다.

이러한 경우에 대한 나의 일반적인 전략은

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

이 작업은 db의 조건에 관계없이 간단하고 오류가 없습니다. 지금 볼 수있는 가장 좋은 옵션은 SQL로 처리하고이를 수행하는 것입니다.

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

그러나 db API 가이를 처리 할 수 ​​있기를 바랍니다.

8
googletorp

파헤친 후 Drupal는 정확한 사용 사례를 위해 준비된 명명 된 도구를 제공합니다.

DB에 행을 삽입하거나 이미 존재하는 경우 기존 행을 업데이트하십시오.

이를 병합 쿼리 라고하며 일부 DB 엔진에 대해 원자 적으로 수행 할 수 있습니다.

구문은 매우 간단합니다.

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

해당 정보는 Delete/UpdateQuery의 execute () 메소드에 의해 직접 리턴됩니다 (예 : pdateQuery :: execute () 참조).

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

InsertQuery :: execute () 는 마지막 삽입 ID를 반환합니다.

9
Berdir