我希望有一个关于如何在 readbeanphp 中批量插入新“bean”而不循环每个实例的示例。
它在这里显示了一个创建和保存 bean 的示例:http ://redbeanphp.com/manual/create_a_bean
它提到了 storeAll($beans) 方法,但我不确定我应该如何格式化 $beans 中的数据。
我已经尝试对此进行谷歌搜索,但找不到与批量插入相关的任何内容。也许我搜索了错误的术语。
我是这个 ORM 的新手,任何帮助将不胜感激,谢谢!
我希望有一个关于如何在 readbeanphp 中批量插入新“bean”而不循环每个实例的示例。
它在这里显示了一个创建和保存 bean 的示例:http ://redbeanphp.com/manual/create_a_bean
它提到了 storeAll($beans) 方法,但我不确定我应该如何格式化 $beans 中的数据。
我已经尝试对此进行谷歌搜索,但找不到与批量插入相关的任何内容。也许我搜索了错误的术语。
我是这个 ORM 的新手,任何帮助将不胜感激,谢谢!
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!
这种方法背后的一些真实数据。第一种方法。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 秒。)
因此,需要先创建每个 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);
在 John Ballinger 建议的方法 1、2 和 3 中,优化运行时间的一种方法是将 storeAll($beans) 执行的所有插入放在一个数据库事务中。这可以按如下方式完成:将“R::storeAll($beans)”行替换为以下三行:
R::begin();
R::storeAll($beans);
R::commit();
当数组 $beans 很大时,这种方法显着减少了运行时间,并且不需要“显式”使用 SQL。