Laravel 5.6 Seeder插入JSON字段时数组转字符串问题求助
解决Laravel 5.6 Seeder中JSON字段插入不重复整数数组的问题
我来帮你搞定这个问题!要给stops这个JSON类型字段存入10个不重复的整数数组,其实Laravel已经帮我们简化了很多操作,下面是修改后的完整Seeder代码,以及关键细节的说明:
完整的RoutesTableSeeder.php代码
<?php use Illuminate\Support\Facades\DB; use Illuminate\Database\Seeder; use Faker\Factory as Faker; use App\Models\Route; class RoutesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $faker = Faker::create(); // 方法1:用range+shuffle生成10个不重复整数(推荐,效率更高) // 先创建1-100的整数数组,打乱后取前10个,范围可以根据你的需求调整 $stops = range(1, 100); shuffle($stops); $stops = array_slice($stops, 0, 10); // 方法2:用Faker的unique方法生成(适合需要更随机的场景) // $stops = []; // for ($i = 0; $i < 10; $i++) { // // 生成1-100之间的唯一整数,注意范围要大于等于需要的数量,否则会报错 // $stops[] = $faker->unique()->numberBetween(1, 100); // } // 插入单条示例数据 Route::create([ 'name' => $faker->sentence(3), // 用Faker生成随机路由名称 'stops' => $stops, // 直接传入PHP数组,Laravel自动转成JSON存入数据库 'created_at' => now(), 'updated_at' => now(), ]); // 如果需要批量插入多条数据(比如100条),可以用下面的方式 // $routesData = []; // for ($i = 0; $i < 100; $i++) { // $batchStops = range(1, 100); // shuffle($batchStops); // $batchStops = array_slice($batchStops, 0, 10); // $routesData[] = [ // 'name' => $faker->sentence(3), // 'stops' => $batchStops, // 'created_at' => now(), // 'updated_at' => now(), // ]; // } // Route::insert($routesData); } }
关键注意事项
- 自动JSON转换:如果你使用Eloquent模型(比如
Route::create()),Laravel会自动将PHP数组转换为JSON字符串存入数据库的JSON类型字段,不需要手动调用json_encode()。如果直接用DB::table()插入,则需要手动转换:'stops' => json_encode($stops)。 - 确保不重复:两种生成不重复整数的方式各有适用场景:
- 方法1适合范围明确、需要快速生成的情况,不会出现重复问题,效率更高。
- 方法2适合需要更随机的数值范围,但要注意生成的数量不能超过你设定的数值范围(比如要生成10个不重复数,范围至少要包含10个不同的数),否则Faker会抛出重复值的异常。
- 字段验证:确保你的
Route模型中,stops字段被设置为可填充(在$fillable数组中包含'stops'),否则create()方法会忽略这个字段。
内容的提问来源于stack exchange,提问作者Ber Tsacianegu del Tepuy
相关产品推荐
相关产品推荐

