传递给 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 必须是数组类型,给定字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何将对象数组作为道具传递给组件,然后将数组的成员作为道具传递给嵌套组件?