我希望有一个关于如何在readbeanphp中批量插入新“bean”而不循环遍历每个实例的示例。
它显示了在此处创建和保存bean的示例:http://redbeanphp.com/manual/create_a_bean
它提到了storeAll($ beans)方法,但我不确定我是如何设置格式化$ beans中的数据。
我尝试使用谷歌搜索,但找不到与批量插入有关的任何内容。也许我已经搜索了错误的条款。
我是这个ORM的新手,任何帮助都会表示赞赏,谢谢!
答案 0 :(得分:12)
你肯定是正确的。使用$bean=R::dispense('bean');
或多个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
然后存储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。