Jak wstawić wiele wierszy z jednego zapytania przy użyciu elokwentnego / płynnego


143

Mam następujące zapytanie:

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

i zgodnie z oczekiwaniami otrzymuję następujący wynik:

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

Czy istnieje sposób skopiowania powyższego wyniku do innej tabeli , aby moja tabela wyglądała tak?

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

Problem polega na tym, że $querymogą spodziewać się dowolnej liczby wierszy, więc nie jestem pewien, jak iterować przez nieznaną liczbę wierszy.


na wypadek, gdyby ktoś nadal tego potrzebował: github.com/laravel/framework/issues/1295#issuecomment-193025045
4givN

Odpowiedzi:


292

Bardzo łatwo jest wykonać zbiorcze wstawianie w Laravel za pomocą Eloquent lub konstruktora zapytań.

Możesz użyć następującego podejścia.

$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

W twoim przypadku masz już dane w $queryzmiennej.


7
Użyj metody -> toArray () w kolekcji obiektów.
Kreshnik Hasanaj

35
Nie wstawia sygnatur czasowych.
guy_fawkes,

20
dodaj 'created_at' => date ('Ymd H: i: s'), 'modified_at' => date ('Ymd H: i: s') do swojej tablicy. źródło: stackoverflow.com/a/26569967/1316842
JR Tan

8
Zastanawiam się, dlaczego Laravel nie ma do tego czegoś takiego jak „createMany”.
Abhishek,

4
Jak mogę odzyskać identyfikatory?
Luvias

21

używając Eloquent

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

Model::insert($data);

insert to metoda konstruktora zapytań. Accessor i mutatory nie będą działać z tą wkładką
Hassan Dad Khan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.