• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 如何写一个属于自己的数据库封装(5)

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

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了数据库封装等相关知识,希望本文的分享对您有所帮助

基本思路

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

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

确认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. 完全不指定范围, 修改表内所有数据

    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

以上就是如何写一个属于自己的数据库封装(5)的详细内容,更多请关注微课江湖其它相关文章!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11MySQL 修改数据库名称的一个新奇方法
  • 2017-05-11如何用workbench导出mysql数据库关系图
  • 2017-09-08mysql5.7第一次登录修改root密码
  • 2018-12-05从4个方面实战Oracle的密码操作
  • 2018-12-05一个过滤重复数据的 SQL 语句
  • 2018-12-05MSSQL存储过程学习笔记一 关于存储过程
  • 2018-12-05Mysql 5.7.18 利用MySQL proxies_priv实现类似用户组管理实例分享
  • 2018-12-05mySQL中LEN()与DATALENGTH()的区别
  • 2018-12-05mysql_field_type()函数的内容推荐
  • 2018-12-05分享一篇mysql优化的实例

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • mysql数据库从服务器移植到个人PC的方法
    • 给Myql创建索引
    • mysql备份与恢复详解
    • Mysql运行环境优化(Linux系统)
    • Linux下MySQL 5.5.8 源码编译安装记录分享
    • mysql的日期和时间函数大全第1/2页
    • mysql实现条件限制语句的实例(一)
    • MySQL中select语句介绍及使用示例
    • MYSQL 数据库事务再认识
    • mysql进阶(十八)完全卸载mysql数据库图文教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有