Come inserire più righe da una singola query usando eloquent / fluent


143

Ho la seguente domanda:

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

e come previsto ottengo il seguente risultato:

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

C'è un modo per copiare il risultato sopra in un'altra tabella in modo che il mio tavolo assomigli a questo?

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

Il problema che ho è che $queryci si può aspettare un numero qualsiasi di righe e quindi non sono sicuro di come scorrere un numero sconosciuto di righe.


nel caso qualcuno ne abbia ancora bisogno: github.com/laravel/framework/issues/1295#issuecomment-193025045
4givN

Risposte:


292

È davvero semplice eseguire un inserimento in blocco in Laravel utilizzando Eloquent o il generatore di query.

È possibile utilizzare il seguente approccio.

$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

Nel tuo caso hai già i dati all'interno della $queryvariabile.


7
Utilizzare il metodo -> toArray () sulla raccolta di oggetti.
Kreshnik Hasanaj,

35
Non inserisce i timestamp.
guy_fawkes,

20
aggiungi 'Created_at' => date ('Ymd H: i: s'), 'modified_at' => date ('Ymd H: i: s') nel tuo array. fonte: stackoverflow.com/a/26569967/1316842
JR Tan

8
Mi chiedo perché Laravel non abbia qualcosa come "createMany" per questo.
Abhishek,

4
Come recuperare gli ID?
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);

insert è il metodo di query builder. Accessor e mutatori non funzioneranno con questo inserto
Hassan Dad Khan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.