0

0

如何写一个属于自己的数据库封装(5)

PHPz

PHPz

发布时间:2017-04-04 14:27:43

|

1638人浏览过

|

来源于php中文网

原创

基本思路

在开始代码之前, 我们需要回想一些日常面对的难题, 或则说不良体验

在实现业务逻辑时, 我们往往都会遇到以下类似场景

确认A先生(id=233)是否会员, 如果是, 修改字段'status'为'active', 否则删除它

在没有框架的时候一般都会这么写的(以下代码略过所有pdo逻辑)

// 首先查询A先生的数据, 获取他的身份
$a = 'select * from users where id = 233';
// 判定是否为会员
if($a->member === true)
    // 是就修改字段
   $b = 'update users set status = 'active' where id = 233';
else
   // 否就删除数据
   $b= 'delete from users where id = 233';

注意,这是因为我们简略了pdo的所有步骤, 试想想更复杂的业务逻辑, 曾经见过满满上千行都是SQL语句的, 代码可读性等于0, 重构无能
所以,凭什么我们需要写的这么多呢, 可以简化啊!

可再操作的数据

当数据返回后,将其转化为实例, 该实例附带函数, 可以进行某些操作

这就是查询篇中为什么数据返回后会被放入函数cast()当中进行转化的原因

使用封装后可以这么做

// 首先查询A先生的数据, 获取他的身份
$a = User::find(233);
// 判定是否存在该id和该id是否为会员
if($a & $a->member)
    // 是就修改字段
   $b = $a->update(['status'=>'active']);
else
   // 否就删除数据
   $b= $a->delete();

接下来我们需要思考

如何对数据库数据进行修改?

这是我自己的肤浅答案

常见的情况我们需要用到条件语法, 对需要修改的数据指定范围, 过滤无需改写的数据

根据以上的说明, 有三种例子

  1. 完全不指定范围, 修改表内所有数据

    MVM mall 网上购物系统
    MVM mall 网上购物系统

    采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压

    下载
    update Actor set first_name = 'new data'
  2. 指定范围, 修改匹配条件的多条数据

    update Actor set first_name = 'new data' where first_name like '%L%'
  3. 指定范围, 依据表的 identity key 或 unique key 修改指定单条数据

    update Actor set first_name = 'new data' where actor_id = 10

根据以上的三种类型, 我们可以开始开发update函数了,
PS:过于高级的update语句我因为经验尚浅无法理解/不曾使用, 欢迎留言


Builder.php

在最后一行添加update函数

// 改写数据库数据
    public function update(array $values) {
        // 如果写保护已经开启,跳出错误
        if($this->writeLock) throw new Exception("data is not allow to update");

        // 编译update语句
        $sql = $this->grammar->compileUpdate($this, $values);

        // 将所有变量的值合成一个数组, 其中包括条件语句部分
        $bindings = array_values(array_merge($values, $this->getBindings()));

        // 返回改写结果,成功true失败false
        return $this->connector->update($sql, $bindings);
    }

Grammar.php

在最后一行添加compileUpdate函数

    public function compileUpdate(Builder $query, $values) {
        // 循环$values, 记得引用
        foreach ($values as $key => &$value) 
            // 将所有$value改成对应的$key=?
            $value = $key.' = ?';

        // 将$values中的之全部掏出在连接起来
        $columns = implode(', ', array_values($values));

        // 附上where语句如果有
        // 由于更复杂的sql update语句我还没试过, 为了不坑人, 所以限制只有where语法有效
        // 欢迎提供更复杂的where语句
        $where = is_null($query->wheres) ? '' : $this->compileWheres($query);

        // 返回update语句
        return trim("update $query->from set $columns $where");
    }

Model.php

添加函数save, 用法见下面例子

// 一种更快捷的update方式
    public function save() {
        return $this->update((array)$this->data);
    }

例子

  • 修改指定数据

$a = Actor::where('first_name', 'ANGELINA')
    ->update(['last_name'=>'changed']);
dd($a);
  • 再操作数据实例

$a = Actor::where('first_name', 'ANGELINA')
    ->first();
dd($a->update(['last_name'=>'again']));
  • 再操作数据实例, 另一种用法

$a = Actor::where('first_name', 'ANGELINA')
    ->first();

$a->last_name = 'save';
dd($a->save());

返回结果

boolean true
// 失败返回false

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

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

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

MySQL 教程
MySQL 教程

共48课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号