Como inserir várias linhas de uma única consulta usando eloquente / fluente

143

Eu tenho a seguinte consulta:

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

e, como esperado, obtenho o seguinte resultado:

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

Existe uma maneira de copiar o resultado acima em outra tabela para que minha tabela fique assim?

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

O problema que tenho é que ele $querypode esperar qualquer número de linhas e, portanto, não tenho certeza de como iterar através de um número desconhecido de linhas.

Billy
fonte

Respostas:

292

É realmente fácil fazer uma inserção em massa no Laravel usando o Eloquent ou o construtor de consultas.

Você pode usar a seguinte abordagem.

$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

No seu caso, você já possui os dados dentro da $queryvariável.

Kreshnik Hasanaj
fonte
7
Use o método -> toArray () na coleção de objetos.
Kreshnik Hasanaj
35
Ele não insere os carimbos de data e hora.
guy_fawkes
20
adicione 'created_at' => data ('Ymd H: i: s'), 'modified_at' => data ('Ymd H: i: s') em sua matriz. O que você precisa saber é o seguinte
JR Tan
8
Eu me pergunto por que o Laravel não tem algo como 'createMany' para isso.
Abhishek 04/07
4
Como recupero os IDs?
Luvias 22/04/19
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
fonte
insert é o método do construtor de consultas. O acessador e os mutadores não funcionarão com esta inserção
Hassan Dad Khan