Heim > Fragen und Antworten > Hauptteil
Eloquent aktualisiert mehrere Datensätze stapelweise
Statt der Stapelzuweisung von Werten zu mehreren Feldern eines Datensatzes,
aber 根据不同条件对不同记录做不同修改
.
Ähnlich wie Großpackung:
DB::table('users')->insert(array(
array('email' => 'taylor@example.com', 'votes' => 0),
array('email' => 'dayle@example.com', 'votes' => 0),
));
Gibt es eine ähnliche Aussage
DB::table('users')->update( array(
array('id'=>1, 'email' => 'taylor1@example.com', 'votes' => 1),
array('id'=>2, 'email' => 'dayle2@example.com', 'votes' => 2),
) , 'id' );
Die implementierte Funktion ist:
Ändern Sie den entsprechenden Datensatz entsprechend der ID:
id=1 „E-Mail“ wird in „taylor1@example.com“ geändert, „Stimmen“ wird in 1 geändert,
id=2 „E-Mail“ wird in „dayle2@example.com“ geändert, „Stimmen“ wird in geändert 2
. . .
CI hat eine ähnliche update_batch-Methode. Ich möchte sie in Laravel konvertieren.
为情所困2017-05-16 16:56:58
框架封装好的方法目前是没有的,但是随手google了一下,在stackoverflow上看到一个和你的这个问题非常匹配的回答,以下复制于stackoverflow,原链接http://stackoverflow.com/questions/26133977/laravel-bulk-update。
I have created My Custom function for Multiple Update like update_batch in CodeIgniter.
Just place this function in any of your model or you can create helper class and place this function in that class:
//test data
/*
$multipleData = array(
array(
'title' => 'My title' ,
'name' => 'My Name 2' ,
'date' => 'My date 2'
),
array(
'title' => 'Another title' ,
'name' => 'Another Name 2' ,
'date' => 'Another date 2'
)
)
*/
/*
* ----------------------------------
* update batch
* ----------------------------------
*
* multiple update in one query
*
* tablename( required | string )
* multipleData ( required | array of array )
*/
static function updateBatch($tableName = "", $multipleData = array()){
if( $tableName && !empty($multipleData) ) {
// column or fields to update
$updateColumn = array_keys($multipleData[0]);
$referenceColumn = $updateColumn[0]; //e.g id
unset($updateColumn[0]);
$whereIn = "";
$q = "UPDATE ".$tableName." SET ";
foreach ( $updateColumn as $uColumn ) {
$q .= $uColumn." = CASE ";
foreach( $multipleData as $data ) {
$q .= "WHEN ".$referenceColumn." = ".$data[$referenceColumn]." THEN '".$data[$uColumn]."' ";
}
$q .= "ELSE ".$uColumn." END, ";
}
foreach( $multipleData as $data ) {
$whereIn .= "'".$data[$referenceColumn]."', ";
}
$q = rtrim($q, ", ")." WHERE ".$referenceColumn." IN (". rtrim($whereIn, ', ').")";
// Update
return DB::update(DB::raw($q));
} else {
return false;
}
}
It will Produces:
UPDATE `mytable` SET `name` = CASE
WHEN `title` = 'My title' THEN 'My Name 2'
WHEN `title` = 'Another title' THEN 'Another Name 2'
ELSE `name` END,
`date` = CASE
WHEN `title` = 'My title' THEN 'My date 2'
WHEN `title` = 'Another title' THEN 'Another date 2'
ELSE `date` END
WHERE `title` IN ('My title','Another title')