Je suis un débutant à Laravel. Je veux amorcer ma base de données. Lorsque j'exécute la commande seed, j'obtiens une exception
[Illuminate\Database\Eloquent\MassAssignmentException]
username
db:seed [--class[="..."]] [--database[="..."]]
Qu'est-ce que je fais mal. La commande que j'utilise est:
php artisan db:seed --class="UsersTableSeeder"
Ma classe de semences est la suivante:
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
et parce qu'elle pense que ma réponse est une bonne solution générique, je la garderai telle quelle.J'utilise Laravel 4.2.
l'erreur que vous voyez
C'est en effet parce que la base de données est protégée contre le remplissage en masse, ce que vous faites lorsque vous exécutez un semeur. Cependant, à mon avis, il n'est pas nécessaire (et peut ne pas être sûr) de déclarer les champs qui doivent être remplis dans votre modèle si vous avez seulement besoin d'exécuter un semoir.
Dans votre dossier d'amorçage, vous avez la classe DatabaseSeeder:
Cette classe agit comme une façade, listant tous les seeders qui doivent être exécutés. Si vous appelez manuellement le semoir UsersTableSeeder via artisan, comme vous l'avez fait avec la
php artisan db:seed --class="UsersTableSeeder"
commande, vous contournez cette classe DatabaseSeeder.Dans cette classe DatabaseSeeder, la commande
Eloquent::unguard();
permet une affectation en masse temporaire sur toutes les tables, ce qui est exactement ce dont vous avez besoin lorsque vous amorcez une base de données. Cette méthode non protégée n'est exécutée que lorsque vous exécutez laphp aristan db:seed
commande, elle est donc temporaire par opposition à rendre les champs remplissables dans votre modèle (comme indiqué dans les réponses acceptées et autres).Tout ce que vous avez à faire est d'ajouter la
$this->call('UsersTableSeeder');
à la méthode run dans la classe DatabaseSeeder et de l'exécuterphp aristan db:seed
dans votre CLI qui exécutera par défaut DatabaseSeeder.Notez également que vous utilisez un nom de classe pluriel Utilisateurs, tandis que Laraval utilise la forme singulière Utilisateur. Si vous décidez de changer votre classe à la forme singulière conventionnelle, vous pouvez simplement décommenter le
//$this->call('UserTableSeeder');
qui a déjà été attribué mais commenté par défaut dans la classe DatabaseSeeder.la source
\Eloquent::reguard();
, car une fois vos devoirs de masse terminés.Pour rendre tous les champs remplissables , déclarez simplement sur votre classe:
Cela vous permettra d'appeler la méthode de remplissage sans déclarer chaque champ.
la source
Ajoutez simplement
Eloquent::unguard();
en haut de la méthode run lorsque vous faites une graine, pas besoin de créer un$fillable
tableau dans tous les modèles que vous devez amorcer.Normalement, cela est déjà spécifié dans la
DatabaseSeeder
classe. Cependant, parce que vous appelezUsersTableSeeder
directement:php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
n'est pas appelé et donne l'erreur.la source
J'ai utilisé ceci et je n'ai aucun problème:
la source
J'obtenais l'exception MassAssignmentException quand j'ai étendu mon modèle comme ça.
J'essayais d'insérer un tableau comme celui-ci
Le problème a été résolu lorsque j'ai créé le modèle de téléchargement en tant que
Référence https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
la source
Modèle approprié à l'utilisateur dans votre fichier de contrôleur.
la source
si vous avez une table et des champs sur la base de données, vous pouvez simplement utiliser cette commande:
la source
Ce n'est pas un bon moyen lorsque vous souhaitez amorcer la base de données.
Utilisez faker au lieu du codage en dur, et avant tout cela, il vaut peut-être mieux tronquer les tables.
Prenons cet exemple:
la source
Utilisez le fillable pour indiquer à laravel quels champs peuvent être remplis à l'aide d'un tableau. Par défaut, Laravel n'autorise pas la mise à jour des champs de la base de données via un tableau
L'opposé de remplissable est guardable .
la source
Si vous utilisez la méthode d'insertion POO, vous n'avez pas à vous soucier des propriétés d'action de masse / remplissables:
la source