在 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-&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"
,

希望对你有所帮助。

【讨论】:

以上是关于在 laravel 中播种时的质量分配错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中的播种表错误?

在 laravel 7 中播种时无法截断表格

Laravel 5 - 部署应用程序后如何自动播种表?

使用 Laravel DB 播种错误禁用 TRIGGER ALL

Laravel4 数据库播种器错误 - 调用未定义的方法 SeedDummyOrders::setContainer()

laravel 8 播种,SQLSTATE[23000]:违反完整性约束: