ThinkPHP6的ORM模型

ThinkPHP6 是一个广泛使用的 PHP 框架,其 ORM(对象关系映射)模型是其核心功能之一。ORM 模型允许开发者通过面向对象的方式来操作数据库,极大地简化了数据库操作代码,提高了开发效率。

1. ORM 简介

ORM(Object-Relational Mapping)通过定义类及其属性与数据库表及字段之间的映射关系,使开发者可以用面向对象的方式操作数据库。ORM 通常具备以下功能:

  • 数据库的 CRUD(创建、读取、更新、删除)操作。
  • 自动处理 SQL 注入等安全问题。
  • 提供查询构造器,简化复杂查询。
  • 支持事务处理。

2. ThinkPHP6 ORM 使用

2.1 数据库配置

config/database.php 文件中配置数据库连接信息:

return [
    // 数据库类型
    'type'            => 'mysql',
    // 服务器地址
    'hostname'        => '127.0.0.1',
    // 数据库名
    'database'        => 'test',
    // 用户名
    'username'        => 'root',
    // 密码
    'password'        => '',
    // 端口
    'hostport'        => '3306',
    // 数据库编码默认采用utf8
    'charset'         => 'utf8',
    // 数据库表前缀
    'prefix'          => 'tp_',
    // 数据库调试模式
    'debug'           => true,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy'          => 0,
    // 数据库读写是否分离 主从式数据库需要设置读写分离
    'rw_separate'     => false,
    // 读写分离后 主服务器数量
    'master_num'      => 1,
    // 指定从服务器序号
    'slave_no'        => '',
    // 是否严格检查字段是否存在
    'fields_strict'   => true,
    // 数据集返回类型
    'resultset_type'  => 'array',
    // 自动写入时间戳字段
    'auto_timestamp'  => false,
    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',
    // 是否需要进行SQL性能分析
    'sql_explain'     => false,
];
2.2 创建模型

app/model 目录下创建一个新的 PHP 文件,例如 User.php

<?php
namespace app\model;

use think\Model;

class User extends Model
{
    // 设置当前模型对应的完整数据表名称
    protected $table = 'tp_user';

    // 读取器:将数据库中的状态值转换为对应的汉字描述
    public function getStatusAttr($value)
    {
        $status = [0 => '禁用', 1 => '正常'];
        return $status[$value];
    }

    // 修改器:将传入的汉字状态转换为对应的数字存储入库
    public function setStatusAttr($value)
    {
        $status = ['禁用' => 0, '正常' => 1];
        return $status[$value];
    }
}
2.3 使用模型

在控制器或其他地方使用模型进行数据库操作:

<?php
namespace app\controller;

use app\BaseController;
use app\model\User;

class UserController extends BaseController
{
    public function index()
    {
        // 查询所有用户
        $users = User::select();

        // 查询单个用户
        $user = User::find(1);

        // 添加用户
        $data = [
            'name' => '新用户',
            'email' => 'newuser@example.com',
            'status' => '正常' // 使用修改器
        ];
        $newUser = User::create($data);

        // 更新用户
        $user = User::find(1);
        $user->name = '更新后的用户名';
        $user->save();

        // 删除用户
        $user = User::find(1);
        $user->delete();

        return json($users);
    }
}

3. 复杂查询

ThinkPHP6 的 ORM 还支持复杂的查询构造器,可以链式调用各种方法来构建 SQL 语句:

<?php
// 查询年龄大于 18 的用户
$users = User::where('age', '>', 18)->select();

// 查询名字为 '张三' 并且年龄大于 18 的用户
$users = User::where('name', '张三')->where('age', '>', 18)->select();

// 使用 or 条件查询
$users = User::where('name', '张三')->orWhere('email', 'like', '%example%')->select();

// 分页查询
$users = User::paginate(10);

4. 事务处理

ThinkPHP6 的 ORM 还支持事务处理,确保一组数据库操作要么全部成功,要么全部失败:

<?php
Db::transaction(function () {
    // 执行数据库操作
    User::create(['name' => '用户A', 'email' => 'userA@example.com']);
    User::create(['name' => '用户B', 'email' => 'userB@example.com']);
    // 如果中途抛出异常,事务会自动回滚
});

通过这些功能,ThinkPHP6 的 ORM 模型为开发者提供了一个强大且灵活的数据库操作工具,使得开发过程更加高效和安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI 大模型重塑软件开发的未来

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

idea 配置 leetcode插件 代码模版

开启自定义模版 codeFileName&#xff1a; $!velocityTool.camelCaseName(${question.titleSlug})Code Template&#xff1a; ${question.content} package leetcode.editor.cn; /*** ${question.title}* author lww* since $!velocityTool.date()*/ public class $!velocit…

微软Microsoft有许多耳熟能详的软件?

微软有许多耳熟能详的软件&#xff0c;以下是一些比较有代表性的&#xff1a; 一、软件类 操作系统&#xff1a; Windows 系列&#xff1a;这是微软最为著名且广泛使用的操作系统&#xff0c;如 Windows 10、Windows 11 等。它为全球绝大多数个人电脑提供了操作平台&#xff0c…

Confluence|Confluence报错:连接MySQL数据库失败

报错信息&#xff1a;Problem connecting to your database 解决方案&#xff1a; 增加一个mysql驱动jar包到容器内部 docker cp ./mysql-connector-java-8.0.19.jar confluence:/opt/atlassian/confluence/confluence/WEB-INF/lib/ 作者&#xff1a;Kkoo 链接&#xff1a;ht…

扣子(Coze):构建智能助手并嵌入个人网站的新选择

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;扣子&#xff08;Coze&#xff09;&#xff1a;构建智能助手并嵌入个人网站的新选择 1. 前言 之前写了一篇关于使用 MaxKB 搭建个人知识库并集成到个人网站的博客&#xff1b; 整个技术路线我觉得还是很好的&#x…

LeetCode - #139 单词拆分

文章目录 前言摘要1. 描述2. 示例3. 答案题解动态规划的思路代码实现代码解析1. **将 wordDict 转换为 Set**2. **初始化 DP 数组**3. **状态转移方程**4. **返回结果** **测试用例**示例 1:示例 2:示例 3: 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗…

SpringCloud篇(服务保护 - Sentinel)

目录 一、雪崩问题及解决方案 1. 雪崩问题 2. 解决方案 方案一&#xff1a;超时处理 方案二&#xff1a;仓壁模式 方案三&#xff1a;断路器模式 方案四&#xff1a;限流 3. 总结 二、服务保护技术对比 三、Sentinel介绍与安装 1. 初识Sentinel 2. Sentinel 优势 3…

MACOS开发、使用常见问题汇总

MACOS常见问题 本文记录使用macos遇到的常见问题&#xff0c;后面会持续更新&#xff0c;觉得有用的可以收藏一下。 打不开xxx.app&#xff0c;因为它来自身份不明的开发者解决方法(开启任何来源) 打开终端&#xff08;Terminal&#xff09;程序 拷贝sudo spctl --master-di…

网络安全之国际主流网络安全架构模型

目前&#xff0c;国际主流的网络安全架构模型主要有&#xff1a; ● 信息技术咨询公司Gartner的ASA&#xff08;Adaptive Security Architecture自适应安全架构&#xff09; ● 美国政府资助的非营利研究机构MITRE的ATT&CK&#xff08;Adversarial Tactics Techniques &…

Linux下 GDB调试器的使用

文章目录 1. 可执行程序的Debug版和Release版区别一、编译选项与目的二、性能与体积三、功能与特性四、查看可执行文件 2. GDB 相关命令GDB常用命令 1. 可执行程序的Debug版和Release版区别 一、编译选项与目的 Debug版&#xff1a; 编译选项&#xff1a;通常使用包含调试信息…

RN开发搬砖经验之—Layout Inspector看不到 DecorView

最近我发现自己已经很久没有使用Layout Inspector这个工具了。今天&#xff0c;为了深入分析React Native&#xff08;RN&#xff09;框架中的一个UI问题&#xff0c;我需要查看RN组件对应的Android原生组件视图层级&#xff08;View tree&#xff09;的实际情况。因此&#xf…

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中&#xff0c;我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API&#xff0c;包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库&#xff0c;并创建user 表 …

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式&#xff1f;二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图&#xff1a; 模板方法设计模式类图 一.什么是模板方法模…

uniapp实现开发遇到过的问题(持续更新中....)

1. 在ios模拟器上会出现底部留白的情况 解决方案&#xff1a; 在manifest.json文件&#xff0c;找到开源码视图配置&#xff0c;添加如下&#xff1a; "app-plus" : {"safearea":{"bottom":{"offset" : "none" // 底部安…

Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装

Python Matplotlib 安装指南&#xff1a;使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一&#xff0c;结合Miniconda可以轻松管理安装和依赖项。在这篇文章中&#xff0c;我们将详细介绍如何使用Miniconda在Linux、mac…

【element-tiptap】Tiptap编辑器核心概念----结构篇

core-concepts 前言&#xff1a;这篇文章来介绍一下 Tiptap 编辑器的一些核心概念 &#xff08;一&#xff09;结构 1、 Schemas 定义文档组成方式。一个文档就是标题、段落以及其他的节点组成的一棵树。 每一个 ProseMirror 的文档都有一个与之相关联的 schema&#xff0c;…

window的wsl(Ubuntu)安装kafka步骤

环境&#xff1a;Win11 WSL(Linux子系统Ubuntu) apache-zookeeper-3.9.3-bin kafka_2.12-3.8.1 思路&#xff1a;apache上分别下载zookeeper和kafka&#xff0c;在wsl环境安装。在kafka上创建消息的topic&#xff0c;发送消息&#xff0c;接受消息&#xff0c;验证是否安…

Notepad++--在开头快速添加行号

原文网址&#xff1a;Notepad--在开头快速添加行号_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Notepad怎样在开头快速添加行号。 需求 原文件 想要的效果 方法 1.添加点号 Alt鼠标左键&#xff0c;从首行选中首列下拉&#xff0c;选中需要添加序号的所有行的首列&#xff…

机器学习基础06_梯度下降

目录 一、为什么使用梯度下降 二、什么是梯度下降 三、为什么要用梯度下降 四、怎么进行梯度下降 1、微分 1.单变量的微分 2.多变量的微分 2、梯度 3、步骤 (1)学习率α (2)梯度(导数)前的负号 4、实例实现 五、sklearn梯度下降 一、为什么使用梯度下降 前面利用正…

《Vue零基础入门教程》第二课:搭建开发环境

往期内容&#xff1a; 《Vue零基础入门教程》第一课&#xff1a;Vue简介 1 搭建开发环境 Vue环境分为两种 不使用构建工具使用构建丁具 首先&#xff0c;我们会介绍 不使用构建工具 的环境,在组件化章节中介绍 使用构建工具 的方式 1) 初始化 使用如下指令初始化 npm i…