【问题标题】:Mass assignment error when seeding in laravel在 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。

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

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

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

    【讨论】:

    • 如果DatabaseSeeder 类调用Eloquent::unguarded(),为什么这个解决方案会有帮助?
    • 它帮助了我。我在使用单个播种机时遇到了同样的错误。
    【解决方案2】:

    faker-&gt;sentences()faker-&gt;paragraphs() 返回 arrays 并且您的班级希望收到一个字符串。

    您可以使用faker-&gt;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"
    },
    

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多