Yii框架AR模式增删改查完整基础示例代码

陌明同学_4736

陌明同学_4736

2026-08-20

780人浏览

原创

Yii2 ActiveRecord 默认推荐数据操作方式,需继承ActiveRecord并正确实现tableName()和primaryKey();find()返回ActiveQuery须调用one()/all(),save()自动区分增删,delete()仅支持实例删除。

yii框架ar模式增删改查完整基础示例代码

Yii2 ActiveRecord 基础 CRUD:直接上能跑的代码

AR(ActiveRecord)在 Yii2 里不是“可选方案”,而是默认推荐的数据操作方式。只要模型类正确继承 yii\db\ActiveRecord,且数据库连接已配置,find()、save()、delete() 就能直接用——但前提是表名、主键、字段映射都对得上,否则会静默失败或抛出 InvalidConfigException 或 IntegrityConstraintViolationException。

定义模型类时必须重写 tableName() 和 primaryKey()

Yii2 不会自动推断表名,也不会默认把 id 当主键(哪怕它存在)。不显式声明,save() 可能插入后不返回 ID,update() 会全表更新,delete() 可能报错。

示例模型 User.php(放在 app/models/ 下):

namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord
{
    public static function tableName()
    {
        return 'user'; // 必须小写,别写成 'User' 或 'users'
    }

    public static function primaryKey()
    {
        return ['id']; // 即使是单字段主键,也必须返回数组
    }
}

常见坑:

  • 表名写成 User(首字母大写)→ 查询时生成 SQL 表名为 `User`,MySQL 报 Table 'mydb.User' doesn't exist
  • primaryKey() 返回 'id'(字符串)→ update() 失败,日志里出现 Calling unknown method: yii\db\ActiveQuery::andWhere()
  • 表主键叫 user_id 却没重写 primaryKey() → findOne(123) 查不到,因为默认按 id 匹配

查:find() 链式调用别漏掉 one() 或 all()

User::find() 返回的是 ActiveQuery 对象,不是数据。不加 one() 或 all(),后续直接 echo 或 foreach 会报 Fatal error: Cannot use object of type yii\db\ActiveQuery as array。

常用写法:

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载
// 查单条(主键查询最简)
$user = User::findOne(123);

// 条件查询单条
$user = User::find()->where(['status' => 1, 'type' => 'admin'])->one();

// 查多条
$users = User::find()->where(['status' => 1])->orderBy('created_at DESC')->limit(10)->all();

// 查数量(不取数据,省资源)
$count = User::find()->where(['status' => 0])->count();

注意点:

  • findOne($id) 底层等价于 find()->where(['id' => $id])->one(),只适用于主键字段名是 id 或已重写 primaryKey() 的情况
  • 用 andFilterWhere() 替代 where() 处理可能为空的搜索条件,避免 SQL 注入和语法错误
  • asArray() 能显著提升大批量读取性能:User::find()->asArray()->all() 返回普通数组,不是对象

增删改:save() 是万能入口,但得先赋值

Yii2 的 save() 同时支持 insert 和 update,取决于模型是否已有主键值。不手动设主键或没调 findOne(),save() 就走插入;否则走更新。删用 delete(),但只能删已有实例(不能像 Laravel 那样 User::where(...)->delete())。

// 新增
$user = new User();
$user->name = 'Alice';
$user->email = 'a@example.com';
$user->status = 1;
if (!$user->save()) {
    var_dump($user->errors); // 必须检查!save() 失败不抛异常,只返回 false
}

// 修改(两种等效写法)
$user = User::findOne(123);
$user->status = 0;
$user->save(); // 自动识别为 UPDATE

// 或批量赋值(需在模型里开启 scenarios / rules)
$user = User::findOne(123);
$user->load(['User' => ['status' => 0]], ''); // 第二个参数是 form name,CLI 场景传空串
$user->save();

// 删除
$user = User::findOne(123);
if ($user) {
    $user->delete(); // 成功返回 int(1),失败返回 false
}

关键细节:

  • save() 前不校验字段规则?那是因为模型没触发验证。默认 save($runValidation = true),但如果模型规则里没定义 name 字段,$user->name = 'xxx' 会被静默忽略——字段必须出现在 rules() 或 safe 列表中才允许批量赋值
  • 想跳过验证强制保存?用 $user->save(false),但生产环境慎用
  • delete() 是软删除还是硬删除,完全由你模型里的 beforeDelete() 行为决定,框架本身只执行 DELETE 语句

AR 看似简单,真正卡住人的永远是模型和数据库结构之间的映射细节——比如时间字段类型是 DATETIME 还是 TIMESTAMP,会影响 created_at 自动填充逻辑;再比如外键约束没关,delete() 直接报 Integrity constraint violation。这些不会在文档里标红加粗,但跑不通第一行 save() 就得回头核对。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

yii yii框架

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
ThinkPHP框架企业级应用开发实战
ThinkPHP框架企业级应用开发实战

本专题围绕 ThinkPHP 框架展开,系统讲解企业级应用开发的关键技术。内容涵盖 MVC 架构设计、路由与中间件配置、数据库操作与 ORM 使用、缓存优化、权限控制以及常用扩展集成。通过完整项目案例,帮助开发者掌握高效、可维护的 PHP 企业级应用开发方法。

2026.05.06

330

22

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.05

7295

14

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

362

13

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

2026.04.09

384

30

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

2026.04.17

243

15

PHP Yii框架专题
PHP Yii框架专题

本专题专注于PHP主流框架Yii的应用,系统讲解MVC架构、路由机制、数据库操作、表单处理、安全验证与RESTful API 开发等核心内容。通过电商网站、后台管理系统与内容管理平台等实战项目,帮助学员快速掌握Yii框架的开发技巧与实战经验。

2025.09.04

3150

22

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习