【问题标题】:How to get the data of the inserted multiple rows in Laravel Eloquent ORM如何在 Laravel Eloquent ORM 中获取插入的多行数据
【发布时间】:2017-04-07 05:14:05
【问题描述】:

所以我设法使用 laravel model::insert(array(...)); 一次保存多个数据

示例数据

array (
  0 => 
  array (
    'organization' => '1',
    'status' => false,
    'project' => '1',
    'act_date' => '2016-11-23 08:19:06',
  ),
  1 => 
  array (
    'organization' => '1',
    'status' => false,
    'project' => '1',
    'act_date' => '2016-11-23 08:19:06',
  ),
)  

我想要的是获取数据,或者插入数组的id 至少。该数据还必须包含与插入的数据数量相对应的多个 id (array({ data[0].id=>1 }, { data[1].id=>2 }))。

model::insert(array(...)); 的问题在于它成功时返回true,否则返回false。

model::create(array(...));返回插入行的数据,但不支持多行插入。

【问题讨论】:

    标签: php mysql arrays laravel eloquent


    【解决方案1】:

    如果您想获取每个插入行的 ID,我真的建议您使用 create() 方法。

    但如果你真的想使用insert(),你可以试试这个(虽然方法有它自己的缺点,我不会使用它):

    model::insert($array);
    $lastIds = model::orderBy('id', 'desc')->take(count($array))->pluck('id');
    

    【讨论】:

    • 太棒了,你指的是什么缺点? @Alexey
    • @HardSpocker 从理论上讲,您可能会在高负载系统上的另一个查询中插入错误的最后一个 ID。我想这取决于您使用的数据库类型,您最好向数据库人员提出这个问题。所以,我建议你使用循环和多个create()->id
    • 还有其他方法吗?我的意思是如果数组足够大,循环多个create()->id 会占用太多时间和资源。
    • @HardSpocker 我不知道任何其他方式。循环create() 通常不会占用大量资源,因为插入查询通常不会经常执行。我知道一个insert() 更快,但我仍然会使用多个create(),尤其是在高负载系统上。
    • 来自文档:“对于 LAST_INSERT_ID(),最近生成的 ID 在每个连接的基础上维护在服务器中。它不会被另一个客户端更改。如果您更新它甚至不会更改另一个具有非魔法值的 AUTO_INCREMENT 列(即,一个非 NULL 且非 0 的值)。同时使用来自多个客户端的 LAST_INSERT_ID() 和 AUTO_INCREMENT 列是完全有效的。每个客户端将收到最后插入的最后一条语句的 ID客户执行。” dev.mysql.com/doc/refman/5.7/en/getting-unique-id.html
    【解决方案2】:

    我觉得这个方法对你有帮助

     $data = array(
            array (
        'organization' => '1',
        'status' => false,
        'project' => '1',
        'act_date' => '2016-11-23 08:19:06',
      ),
            array (
        'organization' => '1',
        'status' => false,
        'project' => '1',
        'act_date' => '2016-11-23 08:19:06',
      ),
    ///////
        );
    
        Model::insert($data);
        DB::table('table')->insert($data);
    

    【讨论】:

      【解决方案3】:

      re:@Alexey Mezenin 担心在高负载系统上返回错误的行。

      对我有用的是生成一个随机字符串,或者您可以使用当前时间戳,并将其添加到我插入的每一行,我称之为“insert_key”,然后在批量插入完成后,我查询包含我的“insert_key”的所有记录的数据库,现在我有了所有新插入的 ID

      【讨论】:

        【解决方案4】:

        另一种方式:

            $savedIds = [];
            foreach($data as $record) {
                $savedIds[] = Model::insertGetId($record);
            }
            $savedRecords = Model::whereIn('id', $savedIds)->get();
        

        【讨论】:

          猜你喜欢
          • 2016-03-16
          • 2019-08-01
          • 2015-03-08
          • 2015-01-28
          • 1970-01-01
          • 2012-09-24
          • 2021-01-19
          • 2012-12-10
          相关资源
          最近更新 更多