如何在 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 中的两列进行查询