Laravel模型创建或更新时自动同步关联属性的最佳实现方案咨询
最佳实现方案
你可以通过在模型中注册saving事件钩子来实现需求,该方案可以同时覆盖创建、更新两种场景,且值会直接写入数据库,满足你针对full_phone_number做数据库查询的要求。
修改后的Address模型代码如下:
use Illuminate\Database\Eloquent\Model; class Address extends Model { protected $fillable = [ 'country_code', 'phone_number', 'full_phone_number', ]; protected static function booted() { static::saving(function (Address $address) { // 仅当国家码或手机号发生变更时,重新拼接完整手机号 if ($address->isDirty(['country_code', 'phone_number'])) { $address->full_phone_number = $address->country_code . $address->phone_number; } }); } }
逻辑说明
saving事件会在模型每次写入数据库(包括新增、更新)前触发,无需分别处理两种场景isDirty方法用于判断指定字段是否发生变更,避免无意义的重复计算- 拼接后的值会直接写入数据库的
full_phone_number字段,不影响后续的数据库筛选操作
注意事项
如果使用查询构造器的批量更新方法(如Address::where(xxx)->update([...]))修改country_code或phone_number,由于批量更新不会触发模型事件,需要手动处理full_phone_number的拼接逻辑。
内容的提问来源于stack exchange,提问作者Caio Kawasaki
相关产品推荐
相关产品推荐

