$wpdb->delete для удаления значений столбцов через массив IN ARRAY()?

22 мая 2016 г., 10:04:44
Просмотры: 21.9K
Голосов: 5

Интересует, возможно ли это?

$wpdb->delete(
    'table_name',
    array('id' => array(1, 2, 3)),
    array('%d')
);

То есть, в данной ситуации нужно удалить 3 строки за раз, обратившись к базе данных только 1 раз. У меня в скрипте может быть много удалений, и я бы предпочел выполнить удаление за один раз, вместо того чтобы проходить циклом по всем id и выполнять $wpdb->delete для каждого по отдельности. Это возможно? Кажется, что должно быть...

3
Комментарии

Вы пробовали это? Или, что еще лучше, поискали информацию?

Tim Malone Tim Malone
22 мая 2016 г. 12:37:53

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

Solomon Closson Solomon Closson
22 мая 2016 г. 20:34:57

Я не понимаю, зачем здесь минусовать... может, тот, кто это сделал, объяснит мне почему? Почему пренебрежительный тон с вопросом, искал ли я информацию? Конечно, я искал, но все равно решил спросить. Разве не для этого этот сайт?

Solomon Closson Solomon Closson
22 мая 2016 г. 20:44:53
Все ответы на вопрос 1
6
12

Нет, метод wpdb::delete не обрабатывает ничего, кроме условий вида WHERE field = X. Вместо этого вы можете просто использовать метод query:

$ids = implode( ',', array_map( 'absint', $ids ) );
$wpdb->query( "DELETE FROM table_name WHERE ID IN($ids)" );
22 мая 2016 г. 13:05:23
Комментарии

Спасибо, я знаю об альтернативах. Не вижу смысла использовать absint, так как это актуально только для UNSIGNED колонок, что может быть не всегда. Но всё равно спасибо за пример альтернативного метода.

Solomon Closson Solomon Closson
22 мая 2016 г. 20:43:32

Просто демонстрирую уровень санитизации; сомневаюсь, что ваши ID будут жестко прописаны в коде?

TheDeadMedic TheDeadMedic
22 мая 2016 г. 20:45:23

Да, ID не жестко прописаны, они находятся в массиве, так что это хороший пример, просто без использования absint. В любом случае, спасибо.

Solomon Closson Solomon Closson
22 мая 2016 г. 21:02:32

Хорошо, тогда просто используйте intval

TheDeadMedic TheDeadMedic
22 мая 2016 г. 21:02:57

Верно, думаю, они должны добавить эту функциональность в WordPress, кажется достаточно простой для добавления. Но пока этого нет, этот ответ подойдет.

Solomon Closson Solomon Closson
22 мая 2016 г. 21:03:36

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

TheDeadMedic TheDeadMedic
22 мая 2016 г. 21:04:41
Показать остальные 1 комментариев