Cómo insertar varias filas de una sola consulta usando elocuente / fluido

143

Tengo la siguiente consulta:

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

y como esperaba obtuve el siguiente resultado:

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

¿Hay alguna forma de copiar el resultado anterior en otra tabla para que mi tabla se vea así?

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

El problema que tengo es que $querypuede esperar cualquier número de filas y, por lo tanto, no estoy seguro de cómo recorrer en iteración un número desconocido de filas.

Porra
fuente
en caso de que alguien todavía lo necesite: github.com/laravel/framework/issues/1295#issuecomment-193025045
4givN

Respuestas:

292

Es realmente fácil hacer una inserción masiva en Laravel usando Eloquent o el generador de consultas.

Puede usar el siguiente enfoque.

$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

En su caso, ya tiene los datos dentro de la $queryvariable.

Kreshnik Hasanaj
fuente
77
Use el método -> toArray () en la colección de objetos.
Kreshnik Hasanaj
35
No inserta las marcas de tiempo.
guy_fawkes
20
agregue 'created_at' => date ('Ymd H: i: s'), 'modified_at' => date ('Ymd H: i: s') en su matriz. fuente: stackoverflow.com/a/26569967/1316842
JR Tan
8
Me pregunto por qué Laravel no tiene algo como 'createMany' para esto.
Abhishek
44
¿Cómo recupero los identificadores?
Luvias
21

usando Eloquent

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

Model::insert($data);
Vishal Varshney
fuente
insert es un método de generador de consultas. El acceso y los mutadores no funcionarán con este inserto
Hassan Dad Khan