Laravel 传递给 Illuminate\Database\Grammar::parameterize() 的工厂参数 1 必须是数组类型,字符串给定

Laravel factory Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, string given

我在尝试 运行 laravel 8 中的工厂时遇到此错误。我已经查看了几个关于此错误的 post,但它们似乎都直接错误地来自 saving/creating。不使用工厂。所以我不确定为什么工厂没有正确保存它。

我的迁移有:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('slug');
        $table->string('name');
        $table->longText('desc');
        $table->foreignId('user_id')->constrained();
        $table->timestamps();
        $table->softDeletes();
    });
}

我的模型有:

class Post extends Model
{
    use HasFactory, SoftDeletes;

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function setSlugAttribute($value)
    {
        $this->attributes['slug'] = Str::slug($this->name);
    }
}

我厂有:

public function definition()
{
    return [
        'name' => $this->faker->words,
        'desc' => $this->faker->sentence,
        'user_id' => rand(1,10)
    ];
}

我的 Post 播种机有:

public function run()
{
    Post::factory()->times(13)->create();
}

我的主要 DatabaseSeeder 运行 是一个用户播种器,可以播种 10 个用户。然后 post 播种机播种 13 posts.

I 运行 php artisan migrate:fresh --seed 当它到达 Post 播种机时失败并出现以下错误:

TypeError

Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, string given, called in /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php on line 886

at vendor/laravel/framework/src/Illuminate/Database/Grammar.php:136 132▕ * 133▕ * @param array $values 134▕ * @return string 135▕ */ ➜ 136▕ public function parameterize(array $values) 137▕ { 138▕ return implode(', ', array_map([$this, 'parameter'], $values)); 139▕ } 140▕

  +1 vendor frames    2   [internal]:0
  Illuminate\Database\Query\Grammars\Grammar::Illuminate\Database\Query\Grammars\{closure}("Odio

voluptatem quis facere possimus ut.", "desc")

  +13 vendor frames    16  database/seeders/PostsSeeder.php:17
  Illuminate\Database\Eloquent\Factories\Factory::create()

我真的不明白为什么它需要一个字符串列数组。

'name' => $this->faker->words 将 return 一个单词数组。

您可以调用底层方法并通过将 true 作为第二个参数传递给 return 一个字符串:

$this->faker->words(3, true) // 3 is the number of words which is the default

或者你可以使用 sentence

$this->faker->sentence

words() documentation