Как получить ID вставленных строк при массовой/пакетной вставке с помощью запроса wpdb?

Вопрос или проблема

Я пишу плагин, в котором мне нужно сохранять данные в пользовательских таблицах, function обращается к API и затем сохраняет данные, для чего мне нужно массовое insert, но так как wpdb не поддерживает это из коробки, я создал function для этого с использованием prepare и query.

Но query не возвращает ID вставленных строк. Как я могу их получить? Есть ли какой-то другой способ или что-то, кроме использования wpdb?

Как описано здесь:

Если вы вставляете несколько строк с помощью одного оператора INSERT,
LAST_INSERT_ID() возвращает значение, сгенерированное только для первой вставленной
строки. Причина этого в том, чтобы сделать возможным легко воспроизвести
такой же оператор INSERT на каком-то другом сервере.

Поэтому, если вам нужен каждый вставленный ID, вы должны использовать отдельные $wpdb->insert команды, тогда у вас будет ID для каждой с помощью $wpdb->insert_id. Документация здесь: https://codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_row

Если вы вставляете много строк с помощью одного запроса, вы не можете получить все вставленные ID, если только, например, не хотите повторно запросить их, если уверены, что можете идентифицировать эти строки уникально.

Ответ или решение

Когда вы работаете с базой данных в WordPress, используя класс wpdb, задачи по вставке данных могут варьироваться от простых до сложных, особенно когда речь идет о массовой вставке данных. Если ваша цель — сохранить данные в пользовательских таблицах, и вы хотите получить ID вставленных строк, существуют нюансы, которые нужно учитывать.

Проблема с получением ID вставленных строк

Как вы отметили в вашем вопросе, при выполнении массовой вставки через один запрос SQL с использованием INSERT, результатом с помощью LAST_INSERT_ID() является ID только первой вставленной строки. Это связано с тем, что MySQL возвращает только первый ID при многократной вставке, чтобы гарантировать идентичность исполнения этого запроса на разных серверах.

Решение: Вставка по одной строке

Если вам действительно нужны все ID вставленных строк, нужно рассмотреть возможность использования встроенной функции $wpdb->insert() для каждой строки данных. Этот метод предоставляет доступ к ID вставленной строки через свойство $wpdb->insert_id.

Пример кода для массовой вставки с получением ID:

global $wpdb;

$data = [
    // Массив данных для вставки
    ['column1' => 'value1a', 'column2' => 'value2a'],
    ['column1' => 'value1b', 'column2' => 'value2b'],
    // Добавьте больше строк как необходимо
];

$inserted_ids = [];

foreach ($data as $row) {
    $wpdb->insert('your_custom_table', $row);
    $inserted_ids[] = $wpdb->insert_id; // Запоминаем ID вставленной строки
}

// $inserted_ids теперь содержит все ID вставленных строк

Альтернатива: Выборка после вставки

Если массовая вставка всё же является более предпочтительным вариантом из-за производительности (например, когда речь идет о большом объеме данных), вы можете рассмотреть дополнительный способ: добавление временной метки или уникального значения, которое позволит вам идентифицировать строки после вставки. После выполнения вставки можно выполнить выборку на основании этого уникального идентификатора.

Пример использования временной метки:

global $wpdb;

$data = [
    // Пример данных с уникальным значением
    ['column1' => 'value1', 'timestamp' => current_time('mysql')],
    ['column1' => 'value2', 'timestamp' => current_time('mysql')],
    // добавьте нужное количество строк
];

$wpdb->insert('your_custom_table', $data);

// Теперь выборка по нужному критерию.
$last_timestamp = current_time('mysql');
$inserted_rows = $wpdb->get_results("SELECT * FROM your_custom_table WHERE timestamp = '$last_timestamp'");

$inserted_ids = wp_list_pluck($inserted_rows, 'id'); // Предполагаем, что 'id' — имя столбца для ID

Выводы

Итак, когда вам нужно произвести массовую вставку и получить все ID вставленных строк, самое простое и надёжное решение — использовать функцию $wpdb->insert() для каждой строки. Тем не менее, если производительность для вас критична, тогда временное уникальное значение — это разумный компромисс, который обеспечит необходимую идентификацию строк.

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

Оцените материал
Добавить комментарий

Капча загружается...