6

各インスタンスをループせずに、readbeanphpに新しい「beans」を一括挿入する方法の例を期待していました。

ここにBeanを作成して保存する例を示します:http://redbeanphp.com/manual/create_a_bean

storeAll($ beans)メソッドについて言及していますが、データを$beansでフォーマットする方法が正確にわかりません。

これをグーグルで試しましたが、バルクインサートに関連するものが見つかりません。たぶん私は間違った用語を検索しました。

私はこのORMに不慣れです、助けていただければ幸いです、ありがとう!

4

4 に答える 4

12

あなたは間違いなく順調です。$bean=R::dispense('bean');または複数の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);

私の知る限り、複数のBeanがある場合は、すべての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もサポートします。お役に立てば幸いです。

于 2012-10-09T05:02:53.083 に答える
4

このアプローチの背後にあるいくつかの実際のデータ。最初のアプローチ。foreachアイテムが見つかりました

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

5660行にかかる時間=私のMacでは43秒

2番目のアプローチ。

$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秒。storeAllは常に存在する場所です。したがって、これらの豆を保管するのに時間がかかります。

3番目のアプローチ

$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を使用してください。

4番目のアプローチ

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を1つだけ作成します。それでも$beanは同じオブジェクトを参照するため、レコードごとに、dispensメソッドを使用して新しいbeenを作成する必要があります。

幸い、すべての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では、実行時間を最適化する1つの方法は、storeAll($ beans)によって実行されるすべての挿入を1つのデータベーストランザクション内に配置することです。これは次のように実行できます。「R::storeAll($ beans)」の行を次の3行に置き換えます。

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

このアプローチにより、配列$ beansが大きい場合の実行時間が大幅に短縮され、SQLを「明示的に」使用する必要がなくなります。

于 2018-10-29T22:43:08.157 に答える