最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-09 09:03:21
文档

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

如何写一个属于自己的数据库封装(5):基本思路在开始代码之前, 我们需要回想一些日常面对的难题, 或则说不良体验在实现业务逻辑时, 我们往往都会遇到以下类似场景确认A先生(id=233)是否会员, 如果是, 修改字段'status'为'active', 否则删除它在没有框架的时候一般都会这么写
推荐度:
导读如何写一个属于自己的数据库封装(5):基本思路在开始代码之前, 我们需要回想一些日常面对的难题, 或则说不良体验在实现业务逻辑时, 我们往往都会遇到以下类似场景确认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)

    如何写一个属于自己的数据库封装(5):基本思路在开始代码之前, 我们需要回想一些日常面对的难题, 或则说不良体验在实现业务逻辑时, 我们往往都会遇到以下类似场景确认A先生(id=233)是否会员, 如果是, 修改字段'status'为'active', 否则删除它在没有框架的时候一般都会这么写
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top