Laravel跨表外键存储:如何将data_industri的ID存入produk_industri
解决Laravel外键存储问题
要把data_industri表的id作为外键nama_perusahaan_id存入produk_industri表,只需调整控制器的数据创建逻辑,同时修正几个细节问题:
1. 修正控制器的创建逻辑
创建DataIndustriModel实例时,保存返回的模型对象,就能拿到刚生成的id,再赋值给produk_industri的外键:
修改后的StoreController代码:
public function store(Request $request) { $this->validate($request, [ 'nama_perusahaan' => 'required', 'pemilik_perusahaan' => 'required', 'alamat' => 'required', 'kecamatan' => 'required', 'kategori' => 'required', 'nilai_investasi' => 'required', 'jml_tenaga_kerja' => 'required', 'koordinat' => 'required', 'klbi' => 'required', 'komoditi' => 'required', 'satuan_komoditi' => 'required', 'kapasitas_komoditi' => 'required', 'gambar' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', ],[ 'nama_perusahaan.required' => 'Nama Perusahaan Mohon Diisi', 'pemilik_perusahaan.required' => 'Pemilik Perusahaan Mohon Diisi', 'alamat.required' => 'Alamat Perusahaan Mohon Diisi', 'kecamatan.required' => 'Kecematan Mohon Dipilih', 'kategori.required' => 'Kategori Perusahaan Mohon Dipilih', 'nilai_investasi.required' => 'Nilai Investasi Mohon Diisi', 'jml_tenaga_kerja.required' => 'Jumlah Tenaga Kerja Mohon Diisi', 'koordinat.required' => 'Lokasi Koordinat Mohon Diisi', 'klbi.required' => 'Kode KLBI Mohon Diisi', 'komoditi.required' => 'Jenis Komoditas Belum Diisi', 'satuan_komoditi.required' => 'Satuan Komoditas Belum Diisi', 'kapasitas_komoditi.required' => 'Kapasitas Komoditas Belum Diisi', 'gambar.required' => 'Ukuran Maksimal Gambar 2MB dan Format JPEG, JPG, PNG, GIF' ]); $data1 = $request->all(); $data1['nama_perusahaan'] = $request->nama_perusahaan; $data1['slug'] = Str::slug($request->nama_perusahaan); $data1['pemilik_perusahaan'] = $request->pemilik_perusahaan; $data1['alamat_perusahaan'] = $request->alamat; $data1['kecamatan_id'] = $request->kecamatan; $data1['kategori_id'] = $request->kategori; $data1['nilai_investasi'] = $request->nilai_investasi; $data1['jml_tenaga_kerja'] = $request->jml_tenaga_kerja; $data1['koordinat'] = $request->koordinat; $data1['gambar'] = $request->file('gambar')->store('industri','public'); $data1['klbi'] = $request->klbi; // 新增:将klbi存入data_industri表 // 保存industri数据并获取实例 $industri = DataIndustriModel::create($data1); $data2 = $request->all(); $data2['nama_perusahaan_id'] = $industri->id; // 用刚创建的industri的id作为外键 $data2['komoditi'] = $request->komoditi; $data2['satuan_komoditi'] = $request->satuan_komoditi; $data2['kapasitas_komoditi'] = $request->kapasitas_komoditi; ProdukIndustriModel::create($data2); FacadesAlert::success('Berhasil', 'Data Berhasil Tersimpan'); return redirect()->route('index'); }
2. 修正ProdukIndustriModel的fillable字段
ProdukIndustriModel的fillable包含了produk_industri_id,但对应的数据库迁移中没有这个字段,会导致报错,需要移除:
class ProdukIndustriModel extends Model { use HasFactory; protected $fillable = [ 'nama_perusahaan_id', // 移除'produk_industri_id',数据库无此字段 'komoditi', 'kapasitas_komoditi', 'satuan_komoditi', ]; }
3. 可选:用关联简化创建逻辑
利用Eloquent关联可以更简洁地创建关联数据,无需手动赋值外键:
修改控制器中的创建部分:
// 保存industri数据并获取实例 $industri = DataIndustriModel::create($data1); // 直接通过关联创建produk $industri->produk_industris()->create([ 'komoditi' => $request->komoditi, 'satuan_komoditi' => $request->satuan_komoditi, 'kapasitas_komoditi' => $request->kapasitas_komoditi, ]);
内容的提问来源于stack exchange,提问作者Erwin Muhammad
相关产品推荐
相关产品推荐

