Вы здесь

Как вставить/удалить из таблицы множество данных за 1 запрос?

0

есть несколько элементов:

$nid=4;
$date=Array
(
    [0] => 2017-07-26
    [1] => 2017-07-27
    [2] => 2017-07-28

)
$time=Array
(
    [0] => 14:30
    [1] => 15:00
    [2] => 15:30
    [3] => 16:30
)

нужно записать в базу все возможные сочетания.
в базе есть соответствующие поля nid, date, time;
прочитал в этом источнике http://xandeadx.ru/blog/drupal/88

но там описан только варит вставки за 1 запрос 1 элемента.
нашел что можно вот так:

INSERT INTO table (date, time, Nid) VALUES (1,2,3), (2,5,6), (7,8,9) .....;

(общий способ)

то есть мои данные после преобразования имели бы вид:

(4, '2017-07-21', '14:00'),(4, '2017-07-21', '14:30'),(4, '2017-07-21', '15:00'),(4, '2017-07-21', '16:30'),(4, '2017-07-22', '14:00'),(4, '2017-07-22', '14:30')

собственно его я и сделал:

$values  = [];

foreach($dates as $d){
    foreach($time as $t){
        $values[] = "($nid, '$d', '$t')";
    }
}


$sql = implode(',', $values);
//(4, '2017-07-21', '14:00'),(4, '2017-07-21', '14:30'),(4, '2017-07-21', '15:00'),(4, '2017-07-21', '16:30'),(4, '2017-07-22', '14:00'),(4, '2017-07-22', '14:30')

но как теперь средствами drupal поместить эти данные в мою таблицу??

Версия Drupal: 
7.x
Категория: 
Database API
Вопрос задан 09.07.2017 - 00:56

Ответы

0
db_query("INSERT INTO {table} (date, time, Nid) VALUES (1,2,3), (2,5,6), (7,8,9) .....");
Ответ дан 09.07.2017 - 01:28
Аватар пользователя xandeadx
xandeadx
1461

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

Комментарий оставлен 09.07.2017 - 11:37
                      db_merge('table')
                        ->key(array(
                            'nid' => $nid,
                            'resdate' => $d,
                            'restime' => $t
                        ))
                        ->fields(array(
                            'nid' => $nid,
                            'resdate' => $d,
                            'restime' => $t
                        ))
                        ->execute();

написал вот так но тут только foreach и многократное обращение к базе

Комментарий оставлен 09.07.2017 - 17:31

Нужно одним запросом, не дочитал. Тогда, может, сделать за 2 хода.
1. Удалить из таблицы данные, которые будут вставляться. В цикле составить выражение db_or(), чтобы в итоге выполнился запрос на удаление с условием WHERE (date=1 AND time=2 AND Nid=3) OR (date=2 AND time=5 AND Nid=6) OR (date=7 AND time=8 AND Nid=9) ...

  1. Сделать один INSERT, как было предложено выше.
Комментарий оставлен 10.07.2017 - 08:25