Comment insérer plusieurs lignes à partir d'une seule requête en utilisant Eloquent / Fluent


143

J'ai la requête suivante:

  $query = UserSubject::where('user_id', Auth::id())->select('subject_id')->get();

et comme prévu, j'obtiens le résultat suivant:

[{"user_id":8,"subject_id":9},{"user_id":8,"subject_id":2}]

Existe-t-il un moyen de copier le résultat ci-dessus dans une autre table pour que ma table ressemble à ceci?

ID|user_id|subject_id
1 |8      |9
2 |8      |2

Le problème que j'ai est que le $querypeut s'attendre à n'importe quel nombre de lignes et je ne sais donc pas comment parcourir un nombre inconnu de lignes.


au cas où quelqu'un en aurait encore besoin: github.com/laravel/framework/issues/1295#issuecomment-193025045
— 4givN

Réponses:


292

Il est vraiment facile de faire une insertion groupée dans Laravel en utilisant Eloquent ou le générateur de requêtes.

Vous pouvez utiliser l'approche suivante.

$data = [
    ['user_id'=>'Coder 1', 'subject_id'=> 4096],
    ['user_id'=>'Coder 2', 'subject_id'=> 2048],
    //...
];

Model::insert($data); // Eloquent approach
DB::table('table')->insert($data); // Query Builder approach

Dans votre cas, vous avez déjà les données dans la $queryvariable.


7
Utilisez la méthode -> toArray () sur la collection d'objets.
— Kreshnik Hasanaj

35
Il n'insère pas les horodatages.
— guy_fawkes

20
ajoutez 'created_at' => date ('Ymd H: i: s'), 'modified_at' => date ('Ymd H: i: s') dans votre tableau. source: stackoverflow.com/a/26569967/1316842
— JR Tan

8
Je me demande pourquoi Laravel n'a pas quelque chose comme «createMany» pour cela.
— Abhishek le

4
Comment récupérer les identifiants?
— Luvias

21

en utilisant Eloquent

$data = array(
    array('user_id'=>'Coder 1', 'subject_id'=> 4096),
    array('user_id'=>'Coder 2', 'subject_id'=> 2048),
    //...
);

Model::insert($data);

insert est la méthode du générateur de requêtes. L'accesseur et les mutateurs ne fonctionneront pas avec cet insert
— Hassan Dad Khan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.