我在我的应用程序中使用laravel。 所以现在我需要每天使用Cron作业更新DB上的许多行。
如果我将使用更新选项内置laravel我需要做这样的事情:
// for example, the update info in array
$arrayToUpadte = [
[
'numberId' => '0500000000',
'usagePer' => '4.5'
],
[
'numberId' => '0500000001',
'usagePer' => '5.6'
],
[
'numberId' => '0500000002',
'usagePer' => '8.1'
],
[
'numberId' => '0500000003',
'usagePer' => '0.3'
]
];
// update will do one query to db every update!!
foreach( $arrayToUpadte as $updates ){
\App\Phonelines::where( 'numberId', '=', $updates['numberId'] )->update([
'usagePer' => $updates['usagePer']
]);
}
所以我的问题是如何改进代码以尽量减少查询?
如果我在常规PHP项目中有这个,我会这样做:
$newValues = [];
foreach( $arrayToUpadte as $updates ){
$newValues[] = $updates['numberId'] . ',' . $updates['usagePer'];
}
$newValues = implode( '),(', $newValues );
$mysqli -> query( "
INSERT INTO `phonelines` ( `numberId`, `usagePer` ) VALUES (" . $newValues . ")
ON DUPLICATE KEY
UPDATE `usagePer` = VALUES( `usagePer` );
" );
在Laravel的框架中有没有办法做到这一点?
答案 0 :(得分:1)
你可以用这个:
DB::raw("INSERT INTO `phonelines` ( `numberId`, `usagePer` )
VALUES (" . $newValues . ") ON DUPLICATE KEY
UPDATE `usagePer` = VALUES( `usagePer` )") ;