如何批量插入RedBeanPhp?

时间:2012-10-08 17:30:36

标签: php orm redbean

我希望有一个关于如何在readbeanphp中批量插入新“bean”而不循环遍历每个实例的示例。

它显示了在此处创建和保存bean的示例:http://redbeanphp.com/manual/create_a_bean

它提到了storeAll($ beans)方法,但我不确定我是如何设置格式化$ beans中的数据。

我尝试使用谷歌搜索,但找不到与批量插入有关的任何内容。也许我已经搜索了错误的条款。

我是这个ORM的新手,任何帮助都会表示赞赏,谢谢!

4 个答案:

答案 0 :(得分:12)

你肯定是正确的。使用$bean=R::dispense('bean');或多个bean作为数组$beans=R::dispense('bean',5);

创建一个新bean

然后用数据填充bean:

$bean->title='Hello World!';
//or with an array
$beans[0]->title='Hello World!';
$beans[1]->title='Hello World! Bean 1';
//etc

然后存储bean:

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。希望有所帮助!

答案 1 :(得分:3)

这种方法背后的一些真实数据。 第一种方法。 已找到foreach项目

$bean = R::dispense('bean');
$bean->title = "hello";
R::store("bean");

我的Mac上5660行= 43秒的时间

第二种方法。

$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行45s。 结果。这些方法都没有更快。 :( RedBean Transactions似乎没有让这更快

来自RedBean https://stackoverflow.com/a/18811996/445492的创建者不支持批量插入,请使用纯SQL。

第四种方法

for循环    R :: exec("插入bean(标题)值(1,' hello world')");

结束

对于5660行7.3s< ----- WOW (请不要我实际上先做一些事情所以这些结果都是-4.3秒。)

答案 2 :(得分:0)

因此,需要首先创建每个bean,并分配创建bean的方法

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

上面的代码即使在存储之后也只创建一个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);

答案 3 :(得分:0)

在John Ballinger建议的方法1、2和3中,一种优化运行时间的方法是将storeAll($ beans)执行的所有插入操作都放在一个数据库事务中。可以按以下步骤完成:用以下三行替换“ R :: storeAll($ beans)”行:

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

当数组$ beans很大时,这种方法大大减少了运行时间,并且不必“显式”使用SQL。