Como podemos realizar inserções de banco de dados em massa no Laravel usando o Eloquent ORM?
Desejo fazer isso no Laravel: https://stackoverflow.com/a/10615821/600516, mas estou recebendo o seguinte erro.
SQLSTATE [HY093]: número de parâmetro inválido: parâmetros nomeados e posicionais misturados.
has_many
relacionamento com seus modelos?Respostas:
Você pode apenas usar
Eloquent::insert()
.Por exemplo:
fonte
Eloquent
de fato. Apenas proxies a chamada aoQuery\Builder@insert()
método. Não há como inserir eficientemente várias linhas com o Eloquent, nem oferece nenhum método para inserções em massa.Podemos atualizar a resposta GTF para atualizar timestamps facilmente
Atualização: para simplificar a data em que podemos usar o carbono, como @Pedro Moreira sugeriu
UPDATE2: para o laravel 5, use em
updated_at
vez demodified_at
fonte
$now
variável:$now = Carbon::now('utc')->toDateTimeString();
. Em seguida, basta usar'created_at' => $now, 'updated_at' => $now
para todas as inserções.Carbon
nessa situação? O que há de erradodate("Y-m-d H:i:s")
?Para quem estiver lendo isso, confira o
createMany()
método .fonte
Model::createMany()
.É assim que você faz de maneira mais eloquente,
fonte
Eu procurei muitas vezes por ele, finalmente usei o costume
timestamps
como abaixo:fonte
Eloquent::insert
é a solução adequada, mas não atualiza os carimbos de data e hora, para que você possa fazer algo como abaixoA idéia é adicionar created_at e updated_at em toda a matriz antes de inserir
fonte
No Laravel 5.7,
Illuminate\Database\Query\Builder
você pode usar o método insertUsing.fonte
UserSubscription
é o nome do meu modelo. Isso retornará "true" se inserir com êxito ou "false".fonte
Talvez uma maneira mais Laravel de resolver esse problema seja usar uma coleção e fazer um loop, inserindo-o com o modelo, aproveitando os carimbos de data e hora.
EDITAR:
Desculpe o meu mal-entendido. Para a inserção em massa, isso pode ajudar e, talvez, com isso, você possa fazer boas semeadoras e otimizá-las um pouco.
fonte
Para a inserção de relações de categoria, deparei-me com o mesmo problema e não fazia ideia, exceto que, no meu modelo eloquente, usei Self () para ter uma instância da mesma classe no foreach para registrar vários salvamentos e identificações de captura.
sem "$ obj = new Self ()", ele salva apenas um registro (quando $ obj era $ this)
fonte
Problema resolvido ... Alterar tabela para migração
Solução:
fonte