thinkphp模型的主键通过重写 pk 属性或 getpk() 方法来设置,无主键表则需要开启 falseprimary 并配合唯一索引进行数据操作。

如何自定义模型主键字段?
在ThinkPHP中,默认主键为 id。若数据库表使用其他字段(如 user_id)作为主键,只需在模型类中定义 protected $pk = 'user_id'; 即可。框架会自动使用该字段进行 find、update 和 delete 操作。

namespace app\model;
use think\Model;
class User extends Model {
// 指定主键为 user_id
protected $pk = 'user_id';
// 或者重写 getPk 方法
// protected function getPk() { return 'user_id'; }
}上述代码定义了 User 模型,主键设为 user_id。调用 User::find(100) 时,生成的SQL为 SELECT * FROM user WHERE user_id = 100。确保该字段在数据库中是唯一的,否则可能导致数据查询错误。
立即学习“PHP免费学习笔记(深入)”;
如何处理没有主键的表?
对于没有主键的表(如日志表),需设置 protected $autoWriteTimestamp = false; 和 protected $pk = false;,并启用 protected $falsePrimary = true;。此时,必须使用唯一索引字段或全表条件进行更新或删除操作。

namespace app\model;
use think\Model;
class Log extends Model {
protected $pk = false;
protected $falsePrimary = true;
// 假设有一个唯一索引字段 unique_code
public function updateByCode($code, $data) {
return $this->where('unique_code', $code)->update($data);
}
}该 Log 模型禁用了自动主键处理。通过 updateByCode 方法,利用唯一索引 unique_code 定位记录。直接调用 $log->save() 会失败,因为缺少主键标识。必须显式指定 where 条件。
基于 save 方法在无主键表中的行为问题
当对无主键表调用 save 方法时,若未提供主键值且未设置 where 条件,ThinkPHP 会抛出异常或执行全表更新。因此,必须始终结合唯一条件使用 save 或 update。



















