6

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

它在这里显示了一个创建和保存 bean 的示例:http ://redbeanphp.com/manual/create_a_bean

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

我已经尝试对此进行谷歌搜索,但找不到与批量插入相关的任何内容。也许我搜索了错误的术语。

我是这个 ORM 的新手,任何帮助将不胜感激,谢谢!

4

4 回答 4

12

You are definitely right on track. Create a new bean using $bean=R::dispense('bean'); or multiple beans as an array $beans=R::dispense('bean',5);

Then you populate the beans with data:

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

Then store the bean(s):

R::store($bean);
//or
R::storeAll($beans);

All the beans must be the same type if you have multiples as far as I know, so you can do something like:

$beans=array();
$beans[]=R::dispense('bean');
$beans[]=R::dispense('bean');
$beans[0]->title='Hello World!';
$beans[1]->title='Hello World!1';
R::storeAll($beans);

I could be wrong about that though. The main thing is that this is all a typical ORM, but redbean also supports regular SQL if you need to use it. Hope that helps!

于 2012-10-09T05:02:53.083 回答
4

这种方法背后的一些真实数据。第一种方法。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 行,46s。storeAll 是一直存在的地方。所以储存这些豆子需要很长时间。

第三种方法

$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 loop
  R::exec("insert into bean(title) values (1,'hello world')");
end for

对于 5660 行 7.3s <----- WOW(请注意:我实际上在做一些事情,所以所有这些结果都是 -4.3 秒。)

于 2014-07-15T20:59:40.243 回答
0

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

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

即使在存储之后,上面的代码也只创建一个 bean。仍然 $bean 引用同一个对象,因此对于每个记录,您必须使用dispens方法创建一个新的。

幸运的是,我们有存储所有 bean 的 storeAll 方法,但它需要一个 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);
于 2015-03-11T11:29:20.917 回答
0

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

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

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

于 2018-10-29T22:43:08.157 回答