StartMVC开发手册

可以快速上手的开发文档

手册目录

模型

模型(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,负责项目中的"数据+业务逻辑"。通过模型可以避免代码重复并实现更好的扩展性。

创建模型

模型存放在模块下的model目录下,模型为一个类,一个模型类就是一个php文件。

命名规范

  • 模型类名:模型名称Model(首字母大写)
  • 模型文件名:模型名称Model.php(首字母大写)
  • 命名空间:app\模块\model
  • 所有模型都继承于基础模型类:startmvc\core\Model

基本结构

// app/home/model/UserModel.php
namespace app\home\model;
use startmvc\core\Model;

class UserModel extends Model
{
    // 定义数据表名
    protected $table = 'users';
    
    // 定义主键(可选,默认为id)
    protected $pk = 'id';
    
    // 自定义业务方法
    public function getActiveUsers()
    {
        return $this->findAll('status = 1');
    }
}

实例化模型

在控制器、其他模型或视图中,可以通过多种方式实例化模型:

通过model()方法载入

namespace app\home\controller;
use startmvc\core\Controller;

class IndexController extends Controller 
{
    public function indexAction()
    {
        // 实例化当前模块的模型
        $userModel = $this->model('User');
        
        // 实例化指定模块的模型
        $adminModel = $this->model('User', 'admin');
        
        // 链式调用
        $users = $this->model('User')->findAll();
    }
}

直接实例化

use app\home\model\UserModel;
$userModel = new UserModel();

使用静态方法

use app\home\model\UserModel;

$userModel = UserModel::model();

// 临时设置表名
$logModel = UserModel::model('logs');

数据查询

查询单条记录

// 通过ID查询
$user = $userModel->find(5);

// 通过字符串条件查询
$user = $userModel->find('name = "张三"');

// 通过数组条件查询
$user = $userModel->find(['status' => 1, 'type' => 'vip']);

// 指定查询字段
$user = $userModel->find(5, 'id,name,email');

查询多条记录

// 查询全部记录
$users = $userModel->findAll();

// 通过字符串条件查询
$users = $userModel->findAll('age > 18');

// 通过数组条件查询
$users = $userModel->findAll(['department' => '技术部']);

// 带排序
$users = $userModel->findAll([], '*', 'created_at DESC');

// 限制返回条数
$users = $userModel->findAll([], '*', '', 10);

// 带偏移量的分页
$users = $userModel->findAll([], '*', 'id DESC', '0,10'); // 从0开始,取10条

条件查询示例

// 基础条件查询
$users = $userModel->findAll('status = 1');

// 使用比较运算符
$users = $userModel->findAll('age > 18 AND score >= 60');

// 使用IN条件
$users = $userModel->findAll('department IN ("技术部", "市场部")');

// 使用LIKE条件
$users = $userModel->findAll('name LIKE "%张%"');

// 使用BETWEEN条件
$users = $userModel->findAll('created_at BETWEEN "2023-01-01" AND "2023-12-31"');

// 复杂条件
$users = $userModel->findAll('(status = 1 AND age > 20) OR is_vip = 1');

分页查询

// 设置分页参数
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$pageSize = 10;

// 执行分页查询
$result = $userModel->paginate($pageSize, $page, ['status' => 1], 'created_at DESC');

// 获取数据和分页信息
$users = $result['data'];
$pagination = $result['pagination'];
// 在视图中使用
// 数据列表:$users
// 总记录数:$pagination['total']
// 当前页:$pagination['current_page']
// 总页数:$pagination['total_pages']

数据操作

插入数据

// 单条插入
$userId = $userModel->insert([
    'name' => '张三',
    'email' => 'zhangsan@example.com',
    'status' => 1,
    'created_at' => date('Y-m-d H:i:s')
]);

// 通过data方法设置数据并插入
$userId = $userModel->data([
    'name' => '李四',
    'email' => 'lisi@example.com'
])->insert();

// 批量插入
$userModel->insert([
    ['name' => '张三', 'status' => 1],
    ['name' => '李四', 'status' => 1]
]);

更新数据

// 通过ID更新
$result = $userModel->update(['name' => '张三(已修改)'], 5);

// 通过条件更新
$result = $userModel->update(
    ['status' => 0, 'updated_at' => date('Y-m-d H:i:s')], 
    'last_login_at < "2023-01-01"'
);

// 通过数组条件更新
$result = $userModel->update(
    ['score' => 100], 
    ['department' => '技术部', 'status' => 1]
);

// 链式操作更新
$result = $userModel->data(['name' => '王五', 'email' => 'wangwu@example.com'])
                   ->update([], 5);

保存数据(自动判断插入或更新)

// 插入新记录
$result = $userModel->save([
    'name' => '张三',
    'email' => 'zhangsan@example.com'
]);

// 更新已有记录
$result = $userModel->save([
    'id' => 5,
    'name' => '张三(已更新)',
    'email' => 'zhangsan@example.com'
]);

// 链式调用
$user = $userModel->data(['name' => '李四'])
                ->data(['email' => 'lisi@example.com'])
                ->save();

删除数据

// 通过ID删除
$result = $userModel->delete(5);

// 通过条件删除
$result = $userModel->delete('status = 0 AND created_at < "2022-01-01"');

// 通过数组条件删除
$result = $userModel->delete(['status' => 0, 'is_deleted' => 1]);

// 清空表(慎用)
$result = $userModel->delete();

直接使用查询构造器

除了使用预定义的方法外,还可以直接使用底层查询构造器进行更灵活的操作:

// 基本查询
$users = $userModel->where('status', 1)
                  ->order('created_at', 'DESC')
                  ->limit(10)
                  ->get();

// 聚合查询
$count = $userModel->where('department', '技术部')->count('id');
$maxScore = $userModel->where('status', 1)->max('score');
$avgAge = $userModel->where('gender', '男')->avg('age');

// 字段查询
$names = $userModel->where('status', 1)->column('name');
$email = $userModel->where('id', 5)->value('email');

// 原生SQL
$results = $userModel->raw('SELECT * FROM users WHERE score > ? AND status = ?', [60, 1]);

事务处理

// 方式一:手动控制事务
$userModel->startTrans();
try {
    $userId = $userModel->insert(['name' => '张三']);
    $logModel->insert(['user_id' => $userId, 'action' => '注册']);
    $userModel->commit();
    return true;
} catch (Exception $e) {
    $userModel->rollback();
    return false;
}

// 方式二:使用闭包自动管理事务
$result = $userModel->transaction(function($model) use ($logModel) {
    $userId = $model->insert(['name' => '李四']);
    $logModel->insert(['user_id' => $userId, 'action' => '注册']);
    return $userId;
});

表维护操作

// 优化表
$userModel->optimize();

// 分析表
$userModel->analyze();

// 检查表
$userModel->check();

// 修复表
$userModel->repair();

// 校验表
$userModel->checksum();

// 清空表
$userModel->truncate();

// 删除表
$userModel->drop();

高级用法

自定义模型示例

namespace app\home\model;
use startmvc\core\Model;

class UserModel extends Model
{
    protected $table = 'users';
    protected $pk = 'id';
    
    // 启用软删除
    protected $softDelete = 'deleted_at';
    
    // 启用时间戳
    protected $timestamps = true;
    protected $createTime = 'created_at';
    protected $updateTime = 'updated_at';
    
    // 获取激活用户
    public function getActiveUsers()
    {
        return $this->findAll('status = 1');
    }
    
    // 获取用户信息与订单
    public function getUserWithOrders($userId)
    {
        $user = $this->find($userId);
        if ($user) {
            $orderModel = $this->model('Order');
            $user['orders'] = $orderModel->findAll(['user_id' => $userId]);
        }
        return $user;
    }
    
    // 修改用户状态
    public function changeStatus($userId, $status)
    {
        return $this->update(['status' => $status], $userId);
    }
    
    // 软删除恢复
    public function restore($userId)
    {
        return $this->update([$this->softDelete => null], $userId);
    }
}

在控制器中使用

namespace app\home\controller;
use startmvc\core\Controller;

class UserController extends Controller
{
    public function indexAction()
    {
        $userModel = $this->model('User');
        $users = $userModel->findAll();
        return $this->display('index', ['users' => $users]);
    }
    
    public function viewAction($id)
    {
        $userModel = $this->model('User');
        $user = $userModel->getUserWithOrders($id);
        return $this->display('view', ['user' => $user]);
    }
    
    public function createAction()
    {
        if ($this->request->isPost()) {
            $data = $this->request->post();
            $userModel = $this->model('User');
            $userId = $userModel->insert($data);
            if ($userId) {
                return $this->redirect('index');
            }
        }
        return $this->display('create');
    }
    
    public function updateAction($id)
    {
        $userModel = $this->model('User');
        if ($this->request->isPost()) {
            $data = $this->request->post();
            $result = $userModel->update($data, $id);
            if ($result) {
                return $this->redirect('index');
            }
        }
        $user = $userModel->find($id);
        return $this->display('update', ['user' => $user]);
    }
    
    public function deleteAction($id)
    {
        $userModel = $this->model('User');
        $result = $userModel->delete($id);
        return $this->redirect('index');
    }
}

总结

StartMVC的模型系统提供了丰富而灵活的数据操作方法,从基本的CRUD操作到高级的事务处理和查询构建,都有简洁直观的API接口。通过合理使用模型,可以有效组织业务逻辑,提高代码复用率,使应用程序更加易于维护和扩展。