SQLite3 基于多表关联查询结果更新车辆预订状态的实现方法
SQLite + Laravel 多表关联更新实现方案
你原写法的核心问题有两个:
- UPDATE关键字后未指定需要更新的目标表
vehicle - SQLite不支持你所用的多表逗号分隔后跟FROM的写法,需调整为符合SQLite语法规范的格式
原生SQL正确写法
兼容全版本SQLite(EXISTS子查询方案,推荐优先用)
UPDATE vehicle SET is_booked = 0 WHERE EXISTS ( SELECT 1 FROM booking WHERE booking.vehicle_rego = vehicle.rego AND booking.client_drivers_license_number = 123456789 );
SQLite 3.33.0及以上版本支持的JOIN写法
UPDATE vehicle SET is_booked = 0 FROM booking WHERE booking.vehicle_rego = vehicle.rego AND booking.client_drivers_license_number = 123456789;
Laravel 项目中实现代码
1. 原生执行(性能最优,避免语法兼容问题)
使用参数绑定避免SQL注入风险:
$clientLicense = '123456789'; \DB::statement(" UPDATE vehicle SET is_booked = 0 WHERE EXISTS ( SELECT 1 FROM booking WHERE booking.vehicle_rego = vehicle.rego AND booking.client_drivers_license_number = ? ) ", [$clientLicense]);
2. 查询构造器写法(更贴合Laravel编码规范)
$clientLicense = '123456789'; \DB::table('vehicle') ->whereExists(function ($query) use ($clientLicense) { $query->from('booking') ->whereColumn('booking.vehicle_rego', 'vehicle.rego') ->where('booking.client_drivers_license_number', $clientLicense); }) ->update(['is_booked' => 0]);
内容的提问来源于stack exchange,提问作者kmurp62rulz
相关产品推荐
相关产品推荐

