Как выполнить массовую вставку с помощью RedBeanPhp?

Я надеялся получить пример того, как массово вставлять новые «бины» в readbeanphp, не зацикливаясь на каждом экземпляре.

Здесь показан пример создания и сохранения bean-компонентов: http://redbeanphp.com/manual/create_a_bean

В нем упоминается метод storeAll($beans), но я не уверен, как именно я должен форматировать данные в $beans.

Я пробовал искать в Google для этого и не могу найти ничего, связанного с массовыми вставками. Возможно, я искал неправильные термины.

Я новичок в этом ORM, буду признателен за любую помощь, спасибо!


person Chris    schedule 08.10.2012    source источник


Ответы (4)


Вы определенно на верном пути. Создайте новый компонент, используя $bean=R::dispense('bean'); или несколько компонентов в виде массива $beans=R::dispense('bean',5);

Затем вы заполняете bean-компоненты данными:

$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);

Насколько я знаю, все bean-компоненты должны быть одного типа, если у вас их несколько, поэтому вы можете сделать что-то вроде:

$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, если вам нужно его использовать. Надеюсь, это поможет!

person Tim Withers    schedule 09.10.2012

Некоторые реальные данные за этим подходом. ПЕРВЫЙ ПОДХОД. для каждого найденного элемента

$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 https://stackoverflow.com/a/18811996/445492 Массовая вставка не поддерживается, используйте чистый sql.

ЧЕТВЕРТЫЙ ПОДХОД

for loop
  R::exec("insert into bean(title) values (1,'hello world')");
end for

для 5660 строк 7,3 с ‹----- WOW (обратите внимание: я на самом деле делаю некоторые вещи до этого, поэтому все эти результаты составляют -4,3 секунды.)

person John Ballinger    schedule 15.07.2014

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

$bean = R::dispense('customers');
$bean->name = "John";
R::store($bean);
$bean->name = "Walter"
R::store($bean);

приведенный выше код создает только один компонент даже после его сохранения. Тем не менее, $bean относится к одному и тому же объекту, поэтому для каждой записи вы должны создать новую запись с помощью метода раздачи.

К счастью, у нас есть метод storeAll, который хранит все bean-компоненты, но для этого требуется массив bean-компонентов. Итак, мы создаем 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);
person Tofeeq    schedule 11.03.2015
comment
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. - person Bono; 11.03.2015
comment
Спасибо Боно, описание добавлено - person Tofeeq; 10.08.2015

В подходах 1, 2 и 3, предложенных Джоном Баллинджером, одним из способов оптимизации времени выполнения является помещение всех вставок, выполняемых storeAll($beans), в одну транзакцию базы данных. Это можно сделать следующим образом: замените строку «R::storeAll($beans)» следующими тремя строками:

R::begin();
R::storeAll($beans);
R::commit();

Этот подход значительно сокращает время выполнения, когда массив $beans велик, и нет необходимости использовать SQL "явно".

person Eric Biagioli    schedule 29.10.2018