Estou aprendendo o Laravel e tenho um arquivo de migração de trabalho criando uma tabela de usuários. Estou tentando preencher um registro de usuário como parte da migração:
public function up()
{
Schema::create('users', function($table){
$table->increments('id');
$table->string('email', 255);
$table->string('password', 64);
$table->boolean('verified');
$table->string('token', 255);
$table->timestamps();
DB::table('users')->insert(
array(
'email' => '[email protected]',
'verified' => true
)
);
});
}
Mas estou recebendo o seguinte erro ao executar php artisan migrate
:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
Obviamente, isso ocorre porque o Artisan ainda não criou a tabela, mas toda a documentação parece dizer que existe uma maneira de usar o Fluent Query para preencher dados como parte de uma migração.
Alguem sabe como? Obrigado!
php
laravel
migration
mysql-error-1146
Adam Hopkinson
fonte
fonte
DB::table('users')->insert([ ['email' => '[email protected]', 'votes' => 0], ['email' => '[email protected]', 'votes' => 0] ]);
Sei que este é um post antigo, mas como surgiu em uma pesquisa no google, pensei em compartilhar alguns conhecimentos aqui. @ erin-geyer apontou que misturar migrações e seeders pode criar dores de cabeça e @justamartin respondeu que às vezes você deseja / precisa que os dados sejam preenchidos como parte de sua implantação.
Eu daria um passo adiante e diria que às vezes é desejável ser capaz de implementar alterações de dados de forma consistente para que você possa, por exemplo, implantar na preparação, ver se tudo está bem e, em seguida, implantar na produção com a confiança dos mesmos resultados (e não precisa se lembrar de executar alguma etapa manual).
No entanto, ainda há valor em separar a semente e a migração, pois essas são duas preocupações relacionadas, mas distintas. Nossa equipe comprometeu-se criando migrações que chamam semeadores. Isso se parece com:
Isso permite que você execute uma semente uma vez, exatamente como uma migração. Você também pode implementar a lógica que impede ou aumenta o comportamento. Por exemplo:
Isso obviamente executaria condicionalmente seu semeador se houver menos de 10 SomeModels. Isso é útil se você deseja incluir o semeador como um semeador padrão que é executado quando você chama
artisan db:seed
e também quando migra para que você não "duplique". Você também pode criar um semeador reverso para que os rollbacks funcionem conforme o esperado, por exemploO segundo parâmetro
--force
é necessário para permitir que o semeador seja executado em um ambiente de produção.fonte
Aqui está uma explicação muito boa de porque usar o Database Seeder do Laravel é preferível a usar Migrations: http://laravelbook.com/laravel-database-seeding/
No entanto, seguir as instruções na documentação oficial é uma ideia muito melhor porque a implementação descrita no link acima não parece funcionar e está incompleta. http://laravel.com/docs/migrations#database-seeding
fonte
Isso deve fazer o que você quiser.
fonte
Outra maneira limpa de fazer isso é definir um método privado que cria instância e persiste o modelo em questão.
Com esta solução, os campos de timestamps serão gerados pelo Eloquent.
EDITAR: é melhor usar o sistema semeador para distinguir a geração da estrutura do banco de dados e a população do banco de dados.
fonte
$model = new App\UserRoles();
, mas além disso ... perfeito!Tentei esse método de inserção de DB, mas como ele não usa o modelo, ele ignorou uma característica lenta que eu tinha no modelo. Então, dado que o modelo para esta tabela existe, assim que ele fosse migrado, imaginei que o modelo estaria disponível para ser usado para inserir dados. E eu vim com isso:
Isso funcionou corretamente e também levou em consideração o traço sluggable em meu modelo para gerar automaticamente um slug para esta entrada, e usa os carimbos de data / hora também. NB. Adicionar o ID não era necessário, no entanto, eu queria IDs específicos para minhas categorias neste exemplo. Testado trabalhando no Laravel 5.8
fonte
Se você já preencheu colunas e adicionou uma nova ou deseja preencher a coluna antiga com novos valores fictícios, faça o seguinte:
fonte