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

Posted

技术标签:

【中文标题】传递给 Illuminate\\Database\\Grammar::parameterize() 的 Laravel 工厂参数 1 必须是数组类型,给定字符串【英文标题】:Laravel factory Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, string given传递给 Illuminate\Database\Grammar::parameterize() 的 Laravel 工厂参数 1 必须是数组类型,给定字符串 【发布时间】:2021-08-19 08:23:51 【问题描述】:

尝试在 laravel 8 中运行工厂时出现此错误。我查看了几篇关于此错误的帖子,但它们似乎都来自直接错误地保存/创建。不使用工厂。所以我不确定为什么工厂没有正确保存它。

我的迁移有:

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)
    ];

我的帖子播种器有:

public function run()

    Post::factory()->times(13)->create();

我的主 DatabaseSeeder 运行一个用户播种器,可以播种 10 个用户。然后是一个播种机来播种 13 个帖子。

我运行 php artisan migrate:fresh --seed 并在到达 Post Seeder 时失败,并出现以下错误:

类型错误

参数 1 传递给 Illuminate\Database\Grammar::parameterize() 必须是数组类型,给定字符串,调用 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php 886行

在供应商/laravel/framework/src/Illuminate/Database/Grammar.php:136 132▕ * 133▕ * @param 数组 $values 134▕ * @return 字符串 135▕ */ ➜ 136▕ 公共函数参数化(数组 $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()

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

【问题讨论】:

这是针对faker包但同样的问题。 Type error: Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, integer given 【参考方案1】:

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

您可以调用底层方法并通过传递 true 作为第二个参数来告诉它返回一个字符串:

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

或者你可以使用类似sentence

$this->faker->sentence

words() documentation

【讨论】:

啊,错误提到了下一个字段“desc”,但我想现在我应该习惯 PHP 错误以及真正的问题通常是如何出现的。我什至也尝试过方法而不是属性,但我不知道第二个布尔参数。

以上是关于传递给 Illuminate\Database\Grammar::parameterize() 的 Laravel 工厂参数 1 必须是数组类型,给定字符串的主要内容,如果未能解决你的问题,请参考以下文章

无法正确地将值从父母传递给孩子和孩子传递给父母

如何将对象数组作为道具传递给组件,然后将数组的成员作为道具传递给嵌套组件?

为啥将 ClientID 传递给 javascript 函数会传递整个控件?

将变量传递给 jQuery 插件参数

如何将环境变量传递给传递给xmllint的命令?

将 JSON 数据从 php 传递给 html-data 属性,然后传递给 Javascript