Laravel 9中如何使用Join关联更新数据库表
在Laravel 9中实现关联表更新操作
针对你需要关联更新data_masters和postes表的需求,以下是几种符合Laravel 9规范的实现方式:
方法一:直接执行原生SQL(最直接)
既然你已经有验证过的原生SQL语句,可以直接通过DB门面执行,也可以加入参数绑定提升安全性:
use Illuminate\Support\Facades\DB; // 直接执行原生语句 $sql = "UPDATE data_masters JOIN postes ON data_masters.id_user = postes.id_user SET data_masters.nama = 'tes update', postes.nama = 'tes update' WHERE data_masters.id_tes = 'PT-5501'"; DB::statement($sql); // 带参数绑定的安全写法(推荐) $nama = 'tes update'; $idTes = 'PT-5501'; DB::statement( "UPDATE data_masters JOIN postes ON data_masters.id_user = postes.id_user SET data_masters.nama = ?, postes.nama = ? WHERE data_masters.id_tes = ?", [$nama, $nama, $idTes] );
方法二:使用查询构造器构建关联更新
用Laravel查询构造器的join+update语法,更贴合框架编码风格,自动处理参数绑定:
use Illuminate\Support\Facades\DB; $nama = 'tes update'; $idTes = 'PT-5501'; DB::table('data_masters') ->join('postes', 'data_masters.id_user', '=', 'postes.id_user') ->where('data_masters.id_tes', $idTes) ->update([ 'data_masters.nama' => $nama, 'postes.nama' => $nama ]);
方法三:通过模型关联实现(需预定义模型)
如果你已经创建了对应模型,可先定义关联关系再批量更新,同时用事务保证数据一致性:
- 定义模型关联:
// app/Models/DataMaster.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class DataMaster extends Model { protected $table = 'data_masters'; public function poste() { return $this->hasOne(Poste::class, 'id_user', 'id_user'); } }
- 执行关联更新:
use App\Models\DataMaster; use Illuminate\Support\Facades\DB; $nama = 'tes update'; $idTes = 'PT-5501'; // 事务确保两个表更新原子性 DB::transaction(function () use ($nama, $idTes) { $dataMasters = DataMaster::where('id_tes', $idTes)->get(); foreach ($dataMasters as $dataMaster) { $dataMaster->update(['nama' => $nama]); $dataMaster->poste?->update(['nama' => $nama]); } });
注:此方法适合数据量较小的场景,数据量大时推荐前两种方法以保证性能。
内容的提问来源于stack exchange,提问作者Wahyu Adi Nugroho
相关产品推荐
相关产品推荐

