You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现子表关联父表时,更新单条记录后批量更新同属性外键记录?

实现子表关联记录同步更新的方案

嘿,我来帮你搞定这个同步更新的需求!你的核心诉求是:当更新子表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:12:32