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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:36:04