Дополнительно
MassAssignmentException в Laravel
Я новичок в 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'
]);
}
}
101
11
Прочитайте этот раздел документа Laravel: http://laravel.com/docs/eloquent#mass-assignment.
Laravel по умолчанию обеспечивает защиту от проблем безопасности массового назначения. Поэтому вы должны вручную определить, какие поля могут быть "массово назначены":
Предупреждение : будьте осторожны, когда разрешаете массовое назначение критических полей, таких как
пароль
илироль
. Это может привести к проблемам безопасности, поскольку пользователи смогут обновлять значения этих полей, когда вы этого не хотите.Я использую фреймворк Laravel 4.2.
ошибки вы видите
действительно, потому что база данных надежно защищена от заполнения скопом, что вы делаете, когда вы выполняете сеялки. Однако, на мой взгляд, это's не нужно (и может быть небезопасно), чтобы объявить, какие поля должны быть заполняемые в вашей модели, Если вам нужно только выполнить сеялки.
В папке высева у вас есть класс DatabaseSeeder:
Этот класс действует как фасад, перечисляя все сеялок, которые необходимо выполнить. Если вы называете UsersTableSeeder сеялки вручную через ремесленником, как вы делали это с помощью PHP ремесленника дБ:семя-класс="и UsersTableSeeder"` в команду, вы обходите этот DatabaseSeeder класс.
В этом DatabaseSeeder класс команды
красноречив::unguard();
позволяет временно массового назначения для всех таблиц, а это именно то, что вам нужно, когда вы находитесь заполнения базы данных. Этот метод unguard выполняется только при выполнении команды php в аристан дБ:семя`, следовательно, временного, а не делает заполняемых полей в модели (как указано в принятом и другие ответы).Все, что вам нужно сделать, это добавить
$это->по телефону('UsersTableSeeder');
на метод run в классе DatabaseSeeder и РНР аристан дБ:семя в свой Кинк, который по умолчанию будет выполнять DatabaseSeeder.Также обратите внимание, что вы используете множественное число пользователей класса, в то время как Laraval используется форма единственного числа пользователей. Если вы решили изменить свой класс на обычных особой формы, можно просто раскомментировать `//$это->по телефону('UserTableSeeder'); по которым уже назначена, но по умолчанию закомментирован в DatabaseSeeder класс.
Просто добавьте
красноречив::unguard();
в верхней части запустить метод, когда вы делаете семян, нет необходимости, чтобы создать$заполняемые
массив во всех моделях, нужно семя.Обычно это уже указано в DatabaseSeeder класса. Однако, поскольку вы'повторного вызова UsersTableSeeder прямо:
в PHP ремесленника дБ:семя-класс=назальный UsersTableSeeder;
Красноречив::unguard();
разве'т быть вызван и дает ошибку.Чтобы сделать все поля, просто объявить в классе:
Это позволит вам вызвать метод Fill без объявления каждого поля.
Я использовал это и не проблема:
Правильная модель пользователя в файле контроллера.
Я получал MassAssignmentException, когда расширял свою модель следующим образом.
Я пытался вставить массив следующим образом
Проблема была решена, когда я создал модель выгрузки как
Ссылка https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
Это не хороший способ, когда вы хотите заполнение базы данных.<БР> Используйте Факер вместо жесткого кодирования, и прежде чем все это, может быть, это's лучше для усечения таблицы. <БР>
Рассмотрим такой пример :
Используйте заполняемые сказать, что Laravel, какие поля можно заполнить, используя массив. По умолчанию, Laravel не позволяют поля базы данных должны быть обновлены через массив
Напротив заполняемые составляет guardable.
Если у вас есть таблица и поля в базе данных, вы можете просто использовать эту команду:
Если вы используете метод ООП вставки, вы не'т нужно беспокоиться о масс-действие/свойства заполнения: