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.


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.


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);

insert é o método do construtor de consultas. O acessador e os mutadores não funcionarão com esta inserção
Hassan Dad Khan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.