Laravel使用Astrotomic多语言包时工厂启动报错:Array to string conversion
解决Astrotomic Laravel Translatable工厂数组转字符串错误
你的错误根源是直接将多语言翻译数组合并到主模型属性数组中,而Astrotomic Translatable的多语言字段存储在单独的翻译表中,主表并不存在uk、ru这类字段,Laravel尝试插入这些不存在的字段时,会把数组值当成字符串处理,触发数组转字符串的异常。
修改后的工厂代码
use Illuminate\Database\Eloquent\Factories\Factory; class YourModelFactory extends Factory { protected $model = YourModel::class; // 替换成你的实际模型类 public function definition(): array { // 仅返回主模型表的字段 return [ 'city_id' => City::inRandomOrder()->first()->id, 'degree' => fake()->numberBetween(1, 2), 'qualification' => fake()->numberBetween(1, 3), 'start_year' => fake()->year(), 'viewed' => fake()->numberBetween(50, 5500), 'status' => true, 'image' => fake()->imageUrl(250, 250), 'sort_order' => fake()->numberBetween(0, 10), 'created_at' => fake()->dateTimeBetween('-4 week', '-3 week'), 'updated_at' => fake()->dateTimeBetween('-2 week', '-1 week'), ]; } public function configure() { // 通过afterCreating回调设置多语言翻译 return $this->afterCreating(function ($model) { $locales = ['uk', 'ru']; foreach ($locales as $locale) { // 为对应语言创建或更新翻译记录 $model->translateOrNew($locale)->fill([ 'slug' => fake()->unique()->randomNumber(4) . '-' . fake()->slug(3), 'name' => fake()->unique()->name(), 'description' => fake()->text(), 'education' => fake()->text(), ])->save(); } }); } }
关键说明
- 字段分离处理:主工厂只负责主表字段的生成,多语言字段通过回调单独插入到翻译表,避免主表字段不匹配的问题。
translateOrNew方法:自动判断对应语言的翻译是否存在,不存在则创建新记录,无需手动处理重复逻辑。- 性能优化:将
City::get()->random()->id改为City::inRandomOrder()->first()->id,避免加载全量城市数据,提升查询效率。
内容的提问来源于stack exchange,提问作者Денис Линник
相关产品推荐
相关产品推荐

