Я новичок в Laravel. Я хочу заполнить свою базу данных. Когда я запускаю команду seed, я получаю исключение
[Illuminate\Database\Eloquent\MassAssignmentException]
username
db:seed [--class[="..."]] [--database[="..."]]
Что я делаю не так. Я использую следующую команду:
php artisan db:seed --class="UsersTableSeeder"
Мой класс семян выглядит следующим образом:
class UsersTableSeeder extends Seeder {
public function run()
{
User::truncate();
User::create([
'username' => 'PaulSheer',
'email' => 'psheer@rute.co.za',
'password' => '45678'
]);
User::create([
'username' => 'Stevo',
'email' => 'steve@rute.co.za',
'password' => '45678'
]);
}
}
MassAssignmentException
и поскольку он считает, что мой ответ является хорошим общим решением, я оставлю его как есть.Я использую Laravel 4.2.
ошибка, которую вы видите
действительно потому, что база данных защищена от массового заполнения, что вы и делаете, когда запускаете сидер. Однако, на мой взгляд, нет необходимости (и может быть небезопасно) объявлять, какие поля должны быть заполнены в вашей модели, если вам нужно только запустить сидер.
В папке для посева у вас есть класс DatabaseSeeder:
Этот класс действует как фасад, перечисляя все сеялки, которые необходимо выполнить. Если вы вызываете сеялку UsersTableSeeder вручную через artisan, как вы это делали с
php artisan db:seed --class="UsersTableSeeder"
командой, вы обходите этот класс DatabaseSeeder.В этом классе DatabaseSeeder команда
Eloquent::unguard();
позволяет временное массовое назначение для всех таблиц, что именно то, что вам нужно, когда вы заполняете базу данных. Этот незащищенный метод выполняется только при запускеphp aristan db:seed
команды, поэтому он является временным, в отличие от заполнения полей в вашей модели (как указано в принятых и других ответах).Все, что вам нужно сделать, это добавить
$this->call('UsersTableSeeder');
метод run в класс DatabaseSeeder и запустить егоphp aristan db:seed
в своем интерфейсе командной строки, который по умолчанию будет запускать DatabaseSeeder.Также обратите внимание, что вы используете имя класса во множественном числе, а Laraval - в единственном числе. Если вы решили изменить свой класс на обычную форму единственного числа, вы можете просто раскомментировать тот,
//$this->call('UserTableSeeder');
который уже был назначен, но закомментирован по умолчанию в классе DatabaseSeeder.источник
\Eloquent::reguard();
после того, как ваши массовые задания будут выполнены.Чтобы сделать все поля заполняемыми , просто объявите в своем классе:
Это позволит вам вызывать метод заполнения без объявления каждого поля.
источник
Просто добавьте
Eloquent::unguard();
в начало метода запуска, когда вы выполняете семя, не нужно создавать$fillable
массив во всех моделях, которые вам нужно заполнить.Обычно это уже указано в
DatabaseSeeder
классе. Однако, поскольку вы вызываетеUsersTableSeeder
напрямую:php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
не вызывается и выдает ошибку.источник
Я использовал это, и у меня нет проблем:
источник
Я получал исключение MassAssignmentException, когда расширял свою модель таким образом.
Я пытался вставить такой массив
Проблема была решена, когда я создал модель загрузки как
Ссылка https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
источник
Пользовательская модель в вашем файле контроллера.
источник
если у вас есть таблица и поля в базе данных, вы можете просто использовать эту команду:
источник
Это не лучший способ, если вы хотите заполнить базу данных.
Используйте фейкер вместо жесткого кодирования, и перед всем этим, возможно, лучше обрезать таблицы.
Рассмотрим этот пример:
источник
Используйте Fillable сказать Laravel , какие поля могут быть заполнены с использованием массива. По умолчанию Laravel не позволяет обновлять поля базы данных через массив.
Противоположность заполняемых является guardable .
источник
Если вы используете метод вставки ООП, вам не нужно беспокоиться о свойствах массового действия / заполнения:
источник