Eu sou um novato no Laravel. Eu quero espalhar meu banco de dados. Quando executo o comando seed, obtenho uma exceção
[Illuminate\Database\Eloquent\MassAssignmentException]
username
db:seed [--class[="..."]] [--database[="..."]]
O que estou fazendo de errado. O comando que uso é:
php artisan db:seed --class="UsersTableSeeder"
Minha classe inicial é a seguinte:
class UsersTableSeeder extends Seeder {
public function run()
{
User::truncate();
User::create([
'username' => 'PaulSheer',
'email' => '[email protected]',
'password' => '45678'
]);
User::create([
'username' => 'Stevo',
'email' => '[email protected]',
'password' => '45678'
]);
}
}
MassAssignmentException
e porque acho que minha resposta é uma boa solução genérica, vou mantê-la como está.Estou usando o Laravel 4.2.
o erro que você está vendo
na verdade, é porque o banco de dados está protegido de encher em massa, que é o que você está fazendo quando está executando um semeador. No entanto, em minha opinião, não é necessário (e pode ser inseguro) declarar quais campos devem ser preenchidos em seu modelo se você só precisar executar um semeador.
Em sua pasta de propagação, você tem a classe DatabaseSeeder:
Esta classe atua como uma fachada, listando todos os seeders que precisam ser executados. Se você chamar o semeador UsersTableSeeder manualmente por meio do artisan, como fez com o
php artisan db:seed --class="UsersTableSeeder"
comando, você ignora esta classe DatabaseSeeder.Nesta classe DatabaseSeeder, o comando
Eloquent::unguard();
permite atribuição temporária em massa em todas as tabelas, que é exatamente o que você precisa quando está propagando um banco de dados. Este método desprotegido só é executado quando você executa ophp aristan db:seed
comando, portanto, é temporário em vez de tornar os campos preenchíveis em seu modelo (conforme declarado nas respostas aceitas e em outras).Tudo o que você precisa fazer é adicionar o
$this->call('UsersTableSeeder');
ao método run na classe DatabaseSeeder e executarphp aristan db:seed
em sua CLI que, por padrão, executará DatabaseSeeder.Observe também que você está usando um nome de classe plural Usuários, enquanto Laraval usa a forma singular Usuário. Se você decidir mudar sua classe para a forma singular convencional, você pode simplesmente descomentar o
//$this->call('UserTableSeeder');
que já foi atribuído, mas comentado por padrão na classe DatabaseSeeder.fonte
\Eloquent::reguard();
, para depois que suas atribuições para a missa forem concluídas.Para tornar todos os campos preenchíveis , basta declarar em sua classe:
Isso permitirá que você chame o método de preenchimento sem declarar cada campo.
fonte
Basta adicionar
Eloquent::unguard();
no início do método de execução ao fazer uma semente, não há necessidade de criar um$fillable
array em todos os modelos que você tem que distribuir.Normalmente, isso já está especificado na
DatabaseSeeder
classe. No entanto, porque você está ligandoUsersTableSeeder
diretamente para o:php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
não está sendo chamado e dá o erro.fonte
Eu usei isso e não tenho problema:
fonte
Eu estava recebendo o MassAssignmentException quando estendi meu modelo assim.
Eu estava tentando inserir uma matriz assim
O problema foi resolvido quando criei o modelo de upload como
Referência https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
fonte
Modelo adequado do usuário em seu arquivo de controlador.
fonte
se você tiver tabela e campos no banco de dados, você pode simplesmente usar este comando:
fonte
Esta não é uma boa maneira quando você deseja semear o banco de dados.
Use faker em vez de hard coding e, antes de tudo isso, talvez seja melhor truncar tabelas.
Considere este exemplo:
fonte
Use o preenchível para informar ao laravel quais campos podem ser preenchidos usando uma matriz. Por padrão, o Laravel não permite que os campos do banco de dados sejam atualizados através de um array
O oposto de preenchível é guardável .
fonte
Se você usar o método OOP de inserção, não precisa se preocupar com as propriedades de ação em massa / preenchimento:
fonte