如何实现子表关联父表时,更新单条记录后批量更新同属性外键记录?
实现子表关联记录同步更新的方案
嘿,我来帮你搞定这个同步更新的需求!你的核心诉求是:当更新子表data_anak里某条记录的nama字段时,所有和这条记录原本同名的子表记录都要同步更新对吧?下面给你两种场景的实现方案,你可以根据实际需求选:
场景1:同步所有子表中同名的记录
如果不管父表关联,只要是子表里叫这个名字的记录都要同步更新,步骤很简单:
首先得先拿到你要修改的那条记录的原始名字,不然没法知道要同步哪些记录:
// 假设你是通过子表的主键id来定位要修改的记录,这里用$anak_id代表这个主键值 $originalAnak = DB::table('data_anak')->where('id', $anak_id)->first(); $oldNama = $originalAnak->nama; // 保存原来的名字
然后直接批量更新所有叫这个旧名字的记录就行:
DB::table('data_anak') ->where('nama', $oldNama) // 匹配所有原本叫这个名字的记录 ->update([ 'nama' => $request->nama_anak, 'jenis_kelamin' => $request->gender_anak, 'tempat_tgl_lahir' => $request->tmt, 'tgl_baptis' => $request->baptis_anak, 'tgl_sidi' => $request->sidi_anak, ]);
场景2:仅同步同一个父表下的同名记录
如果你只想同步和这条记录属于同一个bapak_id(同一个父)的同名记录,那就在查询条件里多加一个bapak_id的限制:
// 先拿到原始记录的旧名字和对应的父id $originalAnak = DB::table('data_anak')->where('id', $anak_id)->first(); $oldNama = $originalAnak->nama; $parentId = $originalAnak->bapak_id; // 只更新同个父下的同名记录 DB::table('data_anak') ->where('bapak_id', $parentId) ->where('nama', $oldNama) ->update([ 'nama' => $request->nama_anak, 'jenis_kelamin' => $request->gender_anak, 'tempat_tgl_lahir' => $request->tmt, 'tgl_baptis' => $request->baptis_anak, 'tgl_sidi' => $request->sidi_anak, ]);
额外小建议:用Laravel模型更省心
如果你的项目里用了Laravel的Eloquent模型(非常推荐!),代码会更简洁好维护:
先建个DataAnak模型:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class DataAnak extends Model { protected $table = 'data_anak'; // 允许批量赋值的字段 protected $fillable = ['nama', 'jenis_kelamin', 'tempat_tgl_lahir', 'tgl_baptis', 'tgl_sidi', 'bapak_id']; }
然后用模型来实现同步更新:
// 找到要修改的原始记录 $originalAnak = DataAnak::find($anak_id); // 同步所有同名记录 DataAnak::where('nama', $originalAnak->nama)->update([ 'nama' => $request->nama_anak, 'jenis_kelamin' => $request->gender_anak, 'tempat_tgl_lahir' => $request->tmt, 'tgl_baptis' => $request->baptis_anak, 'tgl_sidi' => $request->sidi_anak, ]);
这样代码可读性更高,后续维护也方便~
内容的提问来源于stack exchange,提问作者user11974734
相关产品推荐
相关产品推荐

