【问题标题】:How to bulk insert with RedBeanPhp?如何使用 RedBeanPhp 批量插入?
【发布时间】:2012-09-28 23:48:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php orm redbean


    【解决方案1】:

    你绝对是正确的。使用 $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。希望对您有所帮助!

    【讨论】:

      【解决方案2】:

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

      第三种方法

      $beans=R::dispense('bean',5560);
          
      for loop
        $bean[$i]->title = "hello world";
      end for
          
      R::storeAll($beans);
      

      对于 5660 行 45 秒。 结果。这些方法都不是更快。 : ( 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

      【讨论】:

        【解决方案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);
        

        【讨论】:

        • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
        • 感谢 Bono,已添加说明
        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-09-12
          • 2012-10-23
          • 1970-01-01
          • 2016-01-17
          • 2014-04-13
          • 2015-02-09
          • 2011-06-20
          • 1970-01-01
          • 2013-06-30
          相关资源
          最近更新 更多