Laravel 5中使用Factory播种时,如何填充关联中间表?
解决Laravel多对多关联中间表的数据填充问题
嘿,针对你这段Laravel数据填充代码里的procurement_modes()关联中间表填充需求,我给你几种实用的方案,根据你的实际场景选就行:
先明确前提
首先要确保你的ProjectsProgramsActivities模型已经正确定义了和ProcurementMode的多对多关联,比如:
// 在App\ProjectsProgramsActivities.php中 public function procurement_modes() { return $this->belongsToMany(App\ProcurementMode::class) // 如果中间表不是Laravel默认的「模型名_模型名」格式,要手动指定表名: // ->using('App\ProcurementModePap') // 如果有自定义中间表模型的话 // ->withPivot('extra_field') // 如果中间表有额外字段,一定要加上这个 ; }
方案1:关联已存在的ProcurementMode记录
如果你的数据库里已经有ProcurementMode的基础数据,只是需要随机关联几个到当前的$b(也就是ProjectsProgramsActivities实例),可以用attach()方法:
// 随机选取2-3条已存在的ProcurementMode记录关联 $b->procurement_modes()->attach( App\ProcurementMode::inRandomOrder()->take(rand(2, 3))->pluck('id') );
方案2:创建新的ProcurementMode并直接关联
如果需要在填充时同时创建新的ProcurementMode实例并关联到$b,用saveMany()就可以(适合中间表没有额外字段的场景):
// 创建3个新的ProcurementMode实例并关联到当前$b $b->procurement_modes()->saveMany( factory(App\ProcurementMode::class, 3)->make() );
方案3:中间表有额外字段时的填充
如果你的中间表除了默认的关联ID字段,还有自定义字段(比如priority、effective_date这类),那需要在关联时传入额外数据:
方式A:创建新实例并传入中间表字段
$procurementModes = factory(App\ProcurementMode::class, 2)->make(); foreach ($procurementModes as $mode) { $b->procurement_modes()->save($mode, [ 'priority' => rand(1, 5), // 替换成你的中间表字段和对应值 'effective_date' => now()->addDays(rand(1, 30)) ]); }
方式B:关联已有实例并传入中间表字段
$b->procurement_modes()->attach( App\ProcurementMode::inRandomOrder()->take(2)->pluck('id'), [ 'priority' => rand(1, 5), 'effective_date' => now()->addDays(rand(1, 30)) ] );
整合后的完整填充代码示例
这里我用方案1作为示例替换你代码中的???????部分:
public function run() { factory(App\ProjectProcurementManagementPlan::class, 5)->create()->each(function ($a) { $a->paps() ->saveMany( factory(App\ProjectsProgramsActivities::class, 5)->make() ) ->each(function ($b) { $b->pap_schedules()->save(factory(App\PapSchedule::class)->make()); // 替换成你需要的方案 $b->procurement_modes()->attach( App\ProcurementMode::inRandomOrder()->take(rand(2,3))->pluck('id') ); }); }); }
内容的提问来源于stack exchange,提问作者Lucentyr
相关产品推荐
相关产品推荐

