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

5

我通过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(...));返回插入行的数据,但不支持多行插入。
4个回答

4

如果您想获取每行插入的ID,我非常推荐使用create()方法。

但是,如果您真的想使用insert(),可以尝试这个(该方法也有其自身的缺点,我不建议使用):

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

很好,但你提到的缺点是什么?@Alexey - Hard Spocker
1
@HardSpocker 理论上,在高负载系统中,您可能会获得由另一个查询插入的错误最后ID。我猜这取决于您使用的数据库类型,最好向数据库专家提出此问题。因此,我建议您使用循环和多个 create()->id - Alexey Mezenin
有没有其他方法?我的意思是,如果数组足够大,循环多个 create()->id 会占用太多时间和资源。 - Hard Spocker
@HardSpocker 我不知道其他方法。循环 create() 通常不会占用太多资源,因为通常插入查询并不经常执行。我知道 insert() 更快,但是在高负载系统上,我仍然会使用多个 create() - Alexey Mezenin
对于LAST_INSERT_ID(),最近生成的ID在服务器上以每个连接为基础进行维护。它不会被其他客户端更改。即使您使用非魔术值(即非NULL且非0的值)更新另一个AUTO_INCREMENT列,它也不会更改。同时从多个客户端使用LAST_INSERT_ID()和AUTO_INCREMENT列是完全有效的。每个客户端将接收该客户端执行的最后一条语句的最后插入ID。 - jonlink
它并不完美,但目前看来似乎是最好的解决方案。 - Ifch0o1

0

关于在高负载系统上返回错误行的问题,回复@Alexey Mezenin的担忧。

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


0
我认为这个方法对你有帮助。
 $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);

0

另一种方式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接