在 laravel 中播种时的质量分配错误
Posted
技术标签:
【中文标题】在 laravel 中播种时的质量分配错误【英文标题】:Mass assignment error when seeding in laravel 【发布时间】:2014-02-07 07:05:10 【问题描述】:我正在使用 faker 类来帮助播种我的数据库。 DatabaseSeeder 看起来像这样
<?php
class DatabaseSeeder extends Seeder
public function run()
Eloquent::unguard();
$tables = [
'users',
'posts',
];
foreach ($tables as $table)
DB::table($table)->truncate();
$this->call('UsersTableSeeder');
$this->call('PostsTableSeeder');
和 UsersTableSeeder
<?php
class UsersTableSeeder extends Seeder
public function run()
$faker = Faker\Factory::create();
for( $i=0 ; $i<50 ; $i++ )
$user = User::create([
'first_name' => $faker->firstName,
'surname' => $faker->lastName,
'email' => $faker->email,
'username' => $faker->userName,
'bio' => $faker->sentences,
'bio_html' => $faker->sentences,
'wesbite' => $faker->url,
'twitter' => $faker->word,
]);
当我尝试为该表设置种子时,我在终端中收到以下错误。
[Illuminate\Database\Eloquent\MassAssignmentException]
first_name
如果我尝试同时播种,我会得到这个
[ErrorException]
preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
我认为包含Eloquent::unguard();
会阻止此错误?我正在运行最新版本的 Laravel。
【问题讨论】:
【参考方案1】:您可以在模型中定义受保护字段的空数组;
class User extends Eloquent
protected $guarded = [];
【讨论】:
如果DatabaseSeeder
类调用Eloquent::unguarded()
,为什么这个解决方案会有帮助?
它帮助了我。我在使用单个播种机时遇到了同样的错误。【参考方案2】:
faker->sentences()
和 faker->paragraphs()
返回 arrays 并且您的班级希望收到一个字符串。
您可以使用faker->text()
,也可以使用
implode(" ",$faker->sentences());
【讨论】:
目瞪口呆地来到这里,这就是我的解决方案!谢谢!【参考方案3】:好吧,我认为你只需要在你的 DatabaseSeeder.php 中做一些简单的事情,就像这样:
public function run()
Eloquent::unguard();
$this->call('UsersTableSeeder');
$this->call('PostsTableSeeder');
您的 UsersTableSeeder.php,如下所示:
<?php
use Faker\Factory as Faker;
class UsersTableSeeder extends Seeder
public function run()
$faker = Faker::create();
for( $i=0 ; $i<50 ; $i++ )
$user = User::create([
'first_name' => $faker->firstName, // try using str_random(10)
'surname' => $faker->lastName, // try using str_random(20)
'email' => $faker->email,
'username' => $faker->userName, // $faker->unique()->userName
'bio' => $faker->sentences,
'bio_html' => $faker->sentences,
'wesbite' => $faker->url,
'twitter' => $faker->word,
]);
并且,在您的模型中,User.php,添加:
protected $guarded = [];
我在这里执行并且都工作了:
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
我在composer上配置了laravel和faker,如下:
"require":
"laravel/framework": "4.2.*",
"fzaninotto/faker": "dev-master"
,
希望对你有所帮助。
【讨论】:
以上是关于在 laravel 中播种时的质量分配错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel DB 播种错误禁用 TRIGGER ALL
Laravel4 数据库播种器错误 - 调用未定义的方法 SeedDummyOrders::setContainer()