Soy un novato en Laravel. Quiero sembrar mi base de datos. Cuando ejecuto el comando semilla, obtengo una excepción
[Illuminate\Database\Eloquent\MassAssignmentException]
username
db:seed [--class[="..."]] [--database[="..."]]
Qué estoy haciendo mal. El comando que uso es:
php artisan db:seed --class="UsersTableSeeder"
Mi clase semilla es la siguiente:
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
y porque cree que mi respuesta es una buena solución genérica, la mantendré como está.Estoy usando Laravel 4.2.
el error que estas viendo
de hecho, se debe a que la base de datos está protegida contra el llenado en masa, que es lo que está haciendo cuando está ejecutando un sembrador. Sin embargo, en mi opinión, no es necesario (y podría ser inseguro) declarar qué campos deben ser rellenables en su modelo si solo necesita ejecutar un sembrador.
En su carpeta de inicialización tiene la clase DatabaseSeeder:
Esta clase actúa como una fachada, enumerando todas las sembradoras que deben ejecutarse. Si llama al sembrador UsersTableSeeder manualmente a través de artisan, como hizo con el
php artisan db:seed --class="UsersTableSeeder"
comando, omite esta clase DatabaseSeeder.En esta clase de DatabaseSeeder, el comando
Eloquent::unguard();
permite la asignación masiva temporal en todas las tablas, que es exactamente lo que necesita cuando está sembrando una base de datos. Este método de desprotección solo se ejecuta cuando ejecuta elphp aristan db:seed
comando, por lo que es temporal en lugar de hacer que los campos se puedan completar en su modelo (como se indica en las respuestas aceptadas y otras).Todo lo que necesita hacer es agregar el
$this->call('UsersTableSeeder');
método de ejecución en la clase DatabaseSeeder y ejecutarlophp aristan db:seed
en su CLI, que de forma predeterminada ejecutará DatabaseSeeder.También tenga en cuenta que está usando un nombre de clase plural Users, mientras que Laraval usa la forma singular User. Si decide cambiar su clase a la forma singular convencional, simplemente puede descomentar la
//$this->call('UserTableSeeder');
que ya ha sido asignada pero comentada de forma predeterminada en la clase DatabaseSeeder.fuente
\Eloquent::reguard();
, para después de que se completen sus asignaciones masivas.Para que todos los campos se puedan completar , simplemente declare en su clase:
Esto le permitirá llamar al método de relleno sin declarar cada campo.
fuente
Simplemente agregue
Eloquent::unguard();
la parte superior del método de ejecución cuando realice una semilla, no es necesario crear una$fillable
matriz en todos los modelos que tiene que sembrar.Normalmente esto ya está especificado en la
DatabaseSeeder
clase. Sin embargo, debido a que está llamandoUsersTableSeeder
directamente a:php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
no está siendo llamado y da el error.fuente
Usé esto y no tengo ningún problema:
fuente
Recibí MassAssignmentException cuando extendí mi modelo de esta manera.
Estaba tratando de insertar una matriz como esta
El problema se resolvió cuando creé Cargar modelo como
Referencia https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
fuente
Modelo adecuado de usuario en su archivo de controlador.
fuente
si tiene una tabla y campos en la base de datos, simplemente puede usar este comando:
fuente
Esta no es una buena forma cuando desea sembrar una base de datos.
Use faker en lugar de codificación rígida, y antes de todo esto, tal vez sea mejor truncar las tablas.
Considere este ejemplo:
fuente
Use el rellenable para decirle a laravel qué campos se pueden completar usando una matriz. De forma predeterminada, Laravel no permite que los campos de la base de datos se actualicen a través de una matriz
Lo contrario de rellenable es vigilable .
fuente
Si usa el método de inserción OOP, no necesita preocuparse por las propiedades de acción masiva / rellenables:
fuente