Как выполнить массовую вставку с помощью RedBeanPhp?
Я надеялся на пример того, как выполнить массовую вставку новых "bean-компонентов" в readbeanphp без зацикливания на каждом экземпляре.
Здесь показан пример создания и сохранения bean-компонентов здесь: http://redbeanphp.com/manual/create_a_bean
В нем упоминается метод storeAll($beans), но я точно не знаю, как мне отформатировать данные в $beans.
Я попробовал поискать в Google для этого и не могу найти ничего, связанного с массовыми вставками. Возможно, я искал неправильные термины.
Я новичок в этом ORM, любая помощь с приветствуется, спасибо!
4 ответа
Вы определенно на правильном пути. Создайте новый бин, используя $bean=R::dispense('bean');
или несколько бинов в виде массива $beans=R::dispense('bean',5);
Затем вы заполняете бины данными:
$bean->title='Hello World!';
//or with an array
$beans[0]->title='Hello World!';
$beans[1]->title='Hello World! Bean 1';
//etc
Затем сохраните боб (ы):
R::store($bean);
//or
R::storeAll($beans);
Насколько я знаю, все бины должны быть одного типа, если у вас есть кратные, поэтому вы можете сделать что-то вроде:
$beans=array();
$beans[]=R::dispense('bean');
$beans[]=R::dispense('bean');
$beans[0]->title='Hello World!';
$beans[1]->title='Hello World!1';
R::storeAll($beans);
Хотя я могу ошибаться по этому поводу. Главное, что это все типичный ORM, но redbean также поддерживает обычный SQL, если вам нужно его использовать. Надеюсь, это поможет!
Некоторые реальные данные, лежащие в основе этого подхода. ПЕРВЫЙ ПОДХОД. предмет найден
$bean = R::dispense('bean');
$bean->title = "hello";
R::store("bean");
время, необходимое для 5660 строк = 43 с на моем Mac
ВТОРОЙ ПОДХОД.
$beans=array();
$beans[]=R::dispense('bean');
$beans[]=R::dispense('bean');
$beans[0]->title='Hello World!';
$beans[1]->title='Hello World!1';
R::storeAll($beans);
Для 5660 строк, 46 с. МагазинВсе, где все время. Таким образом, требуется много времени, чтобы хранить эти бобы.
ТРЕТИЙ ПОДХОД
$beans=R::dispense('bean',5560);
for loop
$bean[$i]->title = "hello world";
end for
R::storeAll($beans);
Для 5660 строк 45с. Результат. Ни один из этих подходов не является более быстрым.: (Транзакции RedBean, похоже, не делают это быстрее
От создателя RedBean /questions/6460690/paketnaya-vstavka-v-mysql-ot-redbean/6460699#6460699 Массовая вставка не поддерживается, используйте чистый sql.
ЧЕТВЕРТЫЙ ПОДХОД
для цикла R::exec("вставить в bean(title) значения (1," привет мир ")"); конец для
для 5660 строк 7.3s<----- WOW (пожалуйста, не делайте этого раньше, поэтому все эти результаты составляют -4,3 секунды.)
Следовательно, каждый боб должен быть создан в первую очередь, а метод создания бина - это обход
$bean = R::dispense('customers');
$bean->name = "John";
R::store($bean);
$bean->name = "Walter"
R::store($bean);
приведенный выше код создает только один компонент даже после его сохранения. Тем не менее, $ bean ссылается на один и тот же объект, поэтому для каждой записи вы должны создать новый файл с помощью метода выдачи.
К счастью, у нас есть метод storeAll, который хранит все бины, но для этого требуется массив бинов. Поэтому мы создаем bean-компонент в каждой итерации и помещаем его в массив, а затем в конце цикла просто передаем этот массив функции storeAll.
//create empty array
$beans = array();
//for each customer post create a new bean as a row/record
foreach ($post as $customer) {
$bean = R::dispense('customers');
//assign column values
$bean->firstName = $customer['first_name'];
$bean->lastName = $customer['last_name'];
//push row to array
$beans[] = $bean;
}
//store the whole array of beans at once
R::storeAll($beans);
В подходах 1, 2 и 3, предложенных Джоном Баллингером, одним из способов оптимизации времени выполнения является помещение всех вставок, выполняемых storeAll($beans), в одну транзакцию базы данных. Это можно сделать следующим образом: заменить строку "R::storeAll($beans)" на следующие три строки:
R::begin();
R::storeAll($beans);
R::commit();
Этот подход значительно сокращает время выполнения, когда массив $ beans большой, и нет необходимости использовать SQL "явно".