Laravel 例外

我是 Laravel 的新人。我想在我的数据库里加入种子。当我运行種命令时,我得到一个异常

  [Illuminate\Database\Eloquent\MassAssignmentException]
username






db:seed [--class[="..."]] [--database[="..."]]

我做错了什么。我使用的命令是:

php artisan db:seed --class="UsersTableSeeder"

My seed class is as follows:

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'
]);
}
}
143305 次浏览

if you have table and fields on database you can simply use this command :

php artisan db:seed --class=UsersTableSeeder --database=YOURDATABSE

阅读 Laravel 文件的这一部分:

缺省情况下,Laravel 提供了一个针对大规模分配安全问题的保护。这就是为什么您必须手动定义哪些字段可以“大量分配”:

class User extends Model
{
protected $fillable = ['username', 'email', 'password'];
}

警告: 允许大量分配关键字段(如 passwordrole)时要小心。这可能会导致安全问题,因为用户可以在您不愿意的时候更新这些字段值。

当我像这样扩展我的模型时,我得到了 MassAssignmentException。

class Upload extends Eloquent {


}

我试着像这样插入数组

Upload::create($array);//$array was data to insert.

当我将 Upload Model 创建为

class Upload extends Eloquent {
protected $guarded = array();  // Important
}

参考资料 https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670

我用的是 Laravel 4.2。

the error you are seeing

[Illuminate\Database\Eloquent\MassAssignmentException]
username

实际上,这是因为数据库受到保护,不会被大量地填满,而这正是执行播种器时要做的事情。但是,在我看来,如果只需要执行播种器,那么没有必要(而且可能是不安全的)声明模型中哪些字段应该是可填充的。

In your seeding folder you have the DatabaseSeeder class:

class DatabaseSeeder extends Seeder {


/**
* Run the database seeds.
*
* @return void
*/


public function run()
{
Eloquent::unguard();


//$this->call('UserTableSeeder');
}
}

This class acts as a facade, listing all the seeders that need to be executed. If you call the UsersTableSeeder seeder manually through artisan, like you did with the php artisan db:seed --class="UsersTableSeeder" command, you bypass this DatabaseSeeder class.

在这个 DatabaseSeeder 类中,命令 Eloquent::unguard();允许对所有表进行临时大规模分配,这正是为数据库设置种子时所需要的。只有在运行 php aristan db:seed命令时才会执行这个 unGuard 方法,因此它是临时的,而不是让模型中的字段可以填充(如已接受答案和其他答案中所述)。

您所需要做的就是将 $this->call('UsersTableSeeder');添加到 DatabaseSeeder 类中的 run 方法中,并在您的 CLI 中运行 php aristan db:seed,该 CLI 在默认情况下将执行 DatabaseSeeder。

Also note that you are using a plural classname Users, while Laraval uses the the singular form User. If you decide to change your class to the conventional singular form, you can simply uncomment the //$this->call('UserTableSeeder'); which has already been assigned but commented out by default in the DatabaseSeeder class.

当您进行种子操作时,只需在 run 方法的顶部添加 Eloquent::unguard();,不需要在所有必须进行种子操作的模型中创建 $fillable数组。

通常这已经在 DatabaseSeeder类中指定了,但是因为您直接调用了 UsersTableSeeder:

php artisan db:seed --class="UsersTableSeeder"

没有调用 Eloquent::unguard();,因此出现错误。

使用 可填充的告诉 laravel 哪些字段可以使用数组填充。 默认情况下,Laravel 不允许通过数组更新数据库字段

Protected $fillable=array('Fields you want to fill using array');

The opposite of 可填充的 is 守卫森严.

要制作 all fields fillable,只需在你的类上声明:

protected $guarded = array();

这将使您能够在不声明每个字段的情况下调用 fill 方法。

如果使用插入的 OOP 方法,就不需要担心 mass-action/fill able 属性:

$user = new User;
$user->username = 'Stevo';
$user->email = 'steve@rute.co.za';
$user->password = '45678';
$user->save();

当您希望为数据库设定种子时,这不是一个好方法。
使用 骗子代替硬编码,在此之前,最好将表截断。 < br >

考虑一下这个例子:

    // 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);

I used this and have no problem:

protected $guarded=[];

控制器文件中的用户适当模型。

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\User;