Maison > Questions et réponses > le corps du texte
Eloquent met à jour plusieurs enregistrements par lots
Au lieu d'attribuer par lots des valeurs à plusieurs champs d'un enregistrement,
mais 根据不同条件对不同记录做不同修改
.
Semblable à l'insertion en vrac :
DB::table('users')->insert(array(
array('email' => 'taylor@example.com', 'votes' => 0),
array('email' => 'dayle@example.com', 'votes' => 0),
));
Existe-t-il une déclaration similaire
DB::table('users')->update( array(
array('id'=>1, 'email' => 'taylor1@example.com', 'votes' => 1),
array('id'=>2, 'email' => 'dayle2@example.com', 'votes' => 2),
) , 'id' );
La fonction implémentée est :
Modifier l'enregistrement correspondant en fonction de l'id :
id=1 'email' est remplacé par 'taylor1@example.com', 'votes' est remplacé par 1,
id=2 'email' est remplacé par 'dayle2@example.com', 'votes' est remplacé par 2
. . .
CI a une méthode update_batch similaire. Je souhaite la convertir en Laravel. Veuillez me donner plus de conseils.
为情所困2017-05-16 16:56:58
Il n'existe actuellement aucun bon moyen d'encapsuler le framework, mais je viens de le rechercher sur Google et j'ai vu une réponse sur stackoverflow qui correspond très bien à votre question. Ce qui suit est copié de stackoverflow, le lien d'origine est http://stackoverflow.com/questions. / 26133977/laravel-bulk-update.
J'ai créé ma fonction personnalisée pour les mises à jour multiples comme update_batch dans CodeIgniter.
Placez simplement cette fonction dans l'un de vos modèles ou vous pouvez créer une classe d'assistance et placer cette fonction dans cette classe :
//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;
}
}
Il produira :
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')