在laravel播种时的质量分配错误

时间:2014-01-17 19:47:17

标签: php laravel laravel-4

我正在使用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。

3 个答案:

答案 0 :(得分:11)

faker->sentences()faker->paragraphs()返回数组,您的班级希望收到一个字符串。

您可以使用faker->text(),也可以使用

implode(" ",$faker->sentences());

答案 1 :(得分: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

我在作曲家上配置了laravel和faker,就像这样:

"require": {
  "laravel/framework": "4.2.*",
  "fzaninotto/faker": "dev-master"
},

希望对你有所帮助。

答案 2 :(得分:2)

您可以在模型中定义空白的保护字段数组;

class User extends Eloquent
{
    protected $guarded = []; 
}