如何在 Laravel Eloquent ORM 中获取插入的多行数据

Posted

技术标签:

【中文标题】如何在 Laravel Eloquent ORM 中获取插入的多行数据【英文标题】:How to get the data of the inserted multiple rows in 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(...));返回插入行的数据,但不支持多行插入。

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于如何在 Laravel Eloquent ORM 中获取插入的多行数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Eloquent ORM laravel 中获取最后一个插入 ID

如何在 Laravel Eloquent ORM 中获取插入的多行数据

如何在我的 Eloquent ORM laravel 选择中包含一个过程?

如何根据 laravel eloquent orm 中的两列进行查询

如何在不使用Eloquent ORM时构建Laravel应用程序

Angular JS 与 Laravel - 如何绑定 Eloquent ORM 数组以查看