laravel - laravle Eloquent ORM met à jour plusieurs enregistrements en même temps
phpcn_u1582
phpcn_u1582 2017-05-16 16:54:58
0
1
623

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.

phpcn_u1582
phpcn_u1582

répondre à tous(1)
为情所困

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')
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal