Jak możemy wykonać zbiorcze wstawianie baz danych w Laravel przy użyciu Eloquent ORM?
Chcę to zrobić w Laravel: https://stackoverflow.com/a/10615821/600516, ale pojawia się następujący błąd.
SQLSTATE [HY093]: Niepoprawny numer parametru: mieszane parametry nazwane i pozycyjne.
has_many
związek ze swoimi modelami?Odpowiedzi:
Możesz po prostu użyć
Eloquent::insert()
.Na przykład:
źródło
Eloquent
w rzeczywistości nie dotyka . Po prostu przekazuje wywołanieQuery\Builder@insert()
metody. Nie ma sposobu na wydajne wstawianie wielu wierszy za pomocą Eloquent ani nie oferuje żadnej metody wstawiania zbiorczego.Możemy zaktualizować odpowiedź GTF, aby łatwo zaktualizować znaczniki czasu
Aktualizacja: aby uprościć datę, możemy użyć węgla, jak zasugerował @Pedro Moreira
UPDATE2: w przypadku laravel 5 użyj
updated_at
zamiastmodified_at
źródło
$now
zmienną:$now = Carbon::now('utc')->toDateTimeString();
. Następnie po prostu użyj'created_at' => $now, 'updated_at' => $now
do każdego wstawienia.Carbon
w tej sytuacji? Co jest nie takdate("Y-m-d H:i:s")
?Ktokolwiek to czyta, sprawdź
createMany()
metodę .źródło
Model::createMany()
.Tak to robisz w bardziej wymowny sposób,
źródło
Szukałem go wiele razy, w końcu użyłem niestandardowego
timestamps
jak poniżej:źródło
Eloquent::insert
jest właściwym rozwiązaniem, ale nie zaktualizuje sygnatur czasowych, więc możesz zrobić coś takiego jak poniżejPomysł polega na dodaniu created_at i updated_at do całej tablicy przed wstawieniem
źródło
Od Laravel 5.7
Illuminate\Database\Query\Builder
można użyć metody insertUsing.źródło
UserSubscription
to nazwa mojego modelu. Zwróci to „prawda”, jeśli wstawienie zakończy się powodzeniem, w przeciwnym razie „fałsz”.źródło
Być może bardziej Laravelowym sposobem rozwiązania tego problemu jest użycie kolekcji i zapętlenie jej wstawiania z modelem wykorzystującym znaczniki czasu.
EDYTOWAĆ:
Przepraszam za to że nie zrozumiałem. W przypadku wstawiania zbiorczego może to pomóc i być może dzięki temu można stworzyć dobre seedery i nieco je zoptymalizować.
źródło
W przypadku wstawiania relacji kategorii natknąłem się na ten sam problem i nie miałem pojęcia, z wyjątkiem tego, że w moim elokwentnym modelu użyłem Self (), aby mieć instancję tej samej klasy na każdym kroku do zapisywania wielu zapisów i przechwytywania identyfikatorów.
bez "$ obj = new Self ()" zapisuje tylko pojedynczy rekord (gdy $ obj to $ this)
źródło
Problem rozwiązany ... Zmień tabelę na potrzeby migracji
Rozwiązanie:
źródło