Я новичок в 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' => '[email protected]',
'password' => '45678'
]);
User::create([
'username' => 'Stevo',
'email' => '[email protected]',
'password' => '45678'
]);
}
}
Прочитайте этот раздел документа Laravel: http://laravel.com/docs/eloquent#mass-assignment.
Laravel по умолчанию обеспечивает защиту от проблем безопасности массового назначения. Поэтому вы должны вручную определить, какие поля могут быть "массово назначены":
class User extends Model
{
protected $fillable = ['username', 'email', 'password'];
}
Предупреждение : будьте осторожны, когда разрешаете массовое назначение критических полей, таких как пароль
или роль
. Это может привести к проблемам безопасности, поскольку пользователи смогут обновлять значения этих полей, когда вы этого не хотите.
Я использую фреймворк Laravel 4.2.
ошибки вы видите
[Illuminate\Database\Eloquent\MassAssignmentException]
username
действительно, потому что база данных надежно защищена от заполнения скопом, что вы делаете, когда вы выполняете сеялки. Однако, на мой взгляд, это's не нужно (и может быть небезопасно), чтобы объявить, какие поля должны быть заполняемые в вашей модели, Если вам нужно только выполнить сеялки.
В папке высева у вас есть класс DatabaseSeeder:
class DatabaseSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Eloquent::unguard();
//$this->call('UserTableSeeder');
}
}
Этот класс действует как фасад, перечисляя все сеялок, которые необходимо выполнить. Если вы называете UsersTableSeeder сеялки вручную через ремесленником, как вы делали это с помощью PHP ремесленника дБ:семя-класс="и UsersTableSeeder"` в команду, вы обходите этот DatabaseSeeder класс.
В этом DatabaseSeeder класс команды красноречив::unguard();
позволяет временно массового назначения для всех таблиц, а это именно то, что вам нужно, когда вы находитесь заполнения базы данных. Этот метод unguard выполняется только при выполнении команды php в аристан дБ:семя`, следовательно, временного, а не делает заполняемых полей в модели (как указано в принятом и другие ответы).
Все, что вам нужно сделать, это добавить $это->по телефону('UsersTableSeeder');
на метод run в классе DatabaseSeeder и РНР аристан дБ:семя в свой Кинк, который по умолчанию будет выполнять DatabaseSeeder.
Также обратите внимание, что вы используете множественное число пользователей класса, в то время как Laraval используется форма единственного числа пользователей. Если вы решили изменить свой класс на обычных особой формы, можно просто раскомментировать `//$это->по телефону('UserTableSeeder'); по которым уже назначена, но по умолчанию закомментирован в DatabaseSeeder класс.
Просто добавьте красноречив::unguard();
в верхней части запустить метод, когда вы делаете семян, нет необходимости, чтобы создать $заполняемые
массив во всех моделях, нужно семя.
Обычно это уже указано в DatabaseSeeder класса. Однако, поскольку вы'повторного вызова UsersTableSeeder прямо:
в PHP ремесленника дБ:семя-класс=назальный UsersTableSeeder;
Красноречив::unguard();
разве'т быть вызван и дает ошибку.
Чтобы сделать все поля, просто объявить в классе:
protected $guarded = array();
Это позволит вам вызвать метод Fill без объявления каждого поля.
Я использовал это и не проблема:
protected $guarded=[];
Правильная модель пользователя в файле контроллера.
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\User;
Я получал MassAssignmentException, когда расширял свою модель следующим образом.
class Upload extends Eloquent {
}
Я пытался вставить массив следующим образом
Upload::create($array);//$array was data to insert.
Проблема была решена, когда я создал модель выгрузки как
class Upload extends Eloquent {
protected $guarded = array(); // Important
}
Ссылка https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
Это не хороший способ, когда вы хотите заполнение базы данных.<БР> Используйте Факер вместо жесткого кодирования, и прежде чем все это, может быть, это's лучше для усечения таблицы. <БР>
Рассмотрим такой пример :
// Truncate table.
DB::table('users')->truncate();
// Create an instance of faker.
$faker = Faker::create();
// define an array for fake data.
$users = [];
// Make an array of 500 users with faker.
foreach (range(1, 500) as $index)
{
$users[] = [
'group_id' => rand(1, 3),
'name' => $faker->name,
'company' => $faker->company,
'email' => $faker->email,
'phone' => $faker->phoneNumber,
'address' => "{$faker->streetName} {$faker->postCode} {$faker->city}",
'about' => $faker->sentence($nbWords = 20, $variableNbWords = true),
'created_at' => new DateTime,
'updated_at' => new DateTime,
];
}
// Insert into database.
DB::table('users')->insert($users);
Используйте заполняемые сказать, что Laravel, какие поля можно заполнить, используя массив. По умолчанию, Laravel не позволяют поля базы данных должны быть обновлены через массив
Protected $fillable=array('Fields you want to fill using array');
Напротив заполняемые составляет guardable.
Если вы используете метод ООП вставки, вы не'т нужно беспокоиться о масс-действие/свойства заполнения:
$user = new User;
$user->username = 'Stevo';
$user->email = '[email protected]';
$user->password = '45678';
$user->save();