$_auto仅在create()中生效,add()/save()直传数据会绕过自动完成;规则格式为[字段,规则,条件,附加],顺序不可错;TP5+已废弃$_auto,改用修改器。

$_auto 是 ThinkPHP 3.x 中控制数据填充的核心配置,不是写在控制器里、也不是靠 add() 或 save() 直接触发的——它只在调用 create() 方法时生效。
不走 create(),$_auto 就完全不执行。这是最常被忽略的前提。
为什么 $_auto 规则写了却没生效?
常见错误现象:add($data) 或 save($data) 直接传参写入,字段值原样入库,时间戳、加密、默认值全没动。
根本原因:自动完成只绑定在 create() 流程中,而 create() 的作用是「校验 + 过滤 + 自动处理」三合一。绕过它,就等于绕过了整个自动完成机制。
必须这样写:
$User = D('User');
if ($User->create($data)) {
$User->add(); // 注意:这里不传 $data
}
-
create()返回false表示失败(比如验证没过或字段非法),要检查返回值 -
add()和save()此时调用的是模型内部已处理好的$this->data,不是原始$data - 如果跳过
create()直接add($data),$_auto规则彻底失效
$_auto 数组每一项的参数顺序不能错
格式固定为:array(完成字段, 完成规则, [完成条件, 附加规则]),其中方括号内是可选,但位置不能乱。
典型错误写法:array('status', '1', 'string', self::MODEL_INSERT) —— 把 附加规则 和 完成条件 顺序颠倒了,ThinkPHP 会当成字符串直接赋值,不识别规则类型。
正确写法示例:
protected $_auto = array(
array('status', '1'), // 新增/更新都设为 1,默认 string 方式
array('password', 'md5', self::MODEL_INSERT, 'function'), // 新增时用 md5 函数处理
array('update_time', 'time', self::MODEL_UPDATE, 'function'), // 更新时填时间戳
array('name', 'getPrefixName', self::MODEL_BOTH, 'callback'), // 回调模型方法
array('email', 'username', self::MODEL_INSERT, 'field'), // 用 username 字段值填充 email
);
- 第 3 位是
完成条件(self::MODEL_INSERT等),第 4 位才是附加规则('function'等) - 省略完成条件时,默认为
self::MODEL_INSERT;省略附加规则时,默认为'string' -
'callback'对应的方法必须是模型内的 public 方法,且接收一个参数(原始值)
动态设置 auto 规则比静态 $_auto 更灵活
静态 $_auto 写死在模型里,所有操作共用一套规则;而 auto() 方法允许你在控制器里按需覆盖,适合多场景复用同一模型。
例如用户注册和后台管理员添加用户,对密码处理逻辑不同:
$user = M('User');
$regAuto = array(
array('password', 'md5', self::MODEL_INSERT, 'function'),
array('create_time', 'time', self::MODEL_INSERT, 'function'),
);
$adminAuto = array(
array('password', 'think_ucenter_md5', self::MODEL_INSERT, 'function'),
array('create_by', session('admin_id'), self::MODEL_INSERT, 'string'),
);
<p>// 注册走注册规则
if ($user->auto($regAuto)->create($regData)) {
$user->add();
}</p><p>// 后台添加走 admin 规则
if ($user->auto($adminAuto)->create($adminData)) {
$user->add();
}</p>
-
auto()必须在create()之前调用,否则无效 -
auto()设置的规则会完全替换模型类里的$_auto,不是合并 - 适用于需要差异化处理的场景,比如 API 接口、后台管理、定时任务等
ThinkPHP 5+ 已废弃 $_auto,改用修改器(mutator)
如果你正在用 ThinkPHP 5.0 或更高版本,$_auto 和 create() 已被移除。取而代之的是字段级的修改器,定义方式完全不同:
class User extends Model
{
public function setPasswordAttr($value)
{
return md5($value);
}
<pre class="brush:php;toolbar:false;">protected $auto = ['status'];
protected $insert = ['create_time' => 'time'];
protected $update = ['update_time' => 'time'];}
注意点:
-
set + 字段名驼峰 + Attr是修改器命名规范,如setCreateTimeAttr -
$auto、$insert、$update是数组,不是二维规则,只声明字段名,值由修改器或默认值提供 - 没有
field或callback这类附加规则概念,逻辑收归到方法里 - TP5+ 的
save()和create()不再存在,统一用save()或allowField()控制字段白名单
真正容易出问题的地方,是混用 TP3 和 TP5 的文档,把 $_auto 往 TP5 模型里硬套——语法报错,规则静默失效,连日志都不会打。确认版本再动手。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











