$wpdb->обновить несколько строк, как в обычном SQL


Мне было интересно, можно ли использовать $wpdb->update для обновления значений для нескольких строк, например, с помощью IN в "обычном" SQL.

Я хочу выполнить что-то вроде этого примера;

UPDATE [table]
SET [column_1] = [updated_value]
WHERE [column_2] IN ([comma_separated_ids])

Я искал, как это будет работать, но мне еще предстоит найти другой вопрос, задающий этот или любой другой ответ/сообщение в блоге, объясняющее, можно ли это сделать или нет.

На данный момент я использую вместо этого запрос, но было бы лучше с простой строкой.

 6
Author: Eje, 2014-08-01

1 answers

Как вы можете видеть в исходном коде знак = жестко закодирован в методе wpdb::update(), поэтому по умолчанию невозможно использовать IN для метода обновления.

Самый простой способ сделать этот трюк - использовать wpdb::query() с помощью вашего sql-запроса просто убедитесь, что правильно экранированы все значения

Пример:

function wpdb_update_in( $table, $data, $where, $format = NULL, $where_format = NULL ) {

    global $wpdb;

    $table = esc_sql( $table );

    if( ! is_string( $table ) || ! isset( $wpdb->$table ) ) {
        return FALSE;
    }

    $i          = 0;
    $q          = "UPDATE " . $wpdb->$table . " SET ";
    $format     = array_values( (array) $format );
    $escaped    = array();

    foreach( (array) $data as $key => $value ) {
        $f         = isset( $format[$i] ) && in_array( $format[$i], array( '%s', '%d' ), TRUE ) ? $format[$i] : '%s';
        $escaped[] = esc_sql( $key ) . " = " . $wpdb->prepare( $f, $value );
        $i++;
    }

    $q         .= implode( $escaped, ', ' );
    $where      = (array) $where;
    $where_keys = array_keys( $where );
    $where_val  = (array) array_shift( $where );
    $q         .= " WHERE " . esc_sql( array_shift( $where_keys ) ) . ' IN (';

    if( ! in_array( $where_format, array('%s', '%d'), TRUE ) ) {
        $where_format = '%s';
    }

    $escaped = array();

    foreach( $where_val as $val ) {
        $escaped[] = $wpdb->prepare( $where_format, $val );
    }

    $q .= implode( $escaped, ', ' ) . ')';

    return $wpdb->query( $q );
}

Затем используйте его так:

wpdb_update_in(
  'posts', // table
  array( 'post_author' => '1', 'post_status' => 'draft' ), // data
  array( 'post_author' => array( '2', '3', '4', '5' ) ), // where
  array( '%d', '%s' ), // format
  '%d' // where format
);

Выполняемый SQL будет

UPDATE wp_posts
SET post_author = 1, post_status = 'draft'
WHERE post_author IN (2, 3, 4, 5)
 10
Author: gmazzap, 2017-05-11 21:11:11