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.