如何寫一個屬於自己的資料庫封裝(5)

PHPz
發布: 2017-04-04 14:27:43
原創
1533 人瀏覽過


基本想法

在開始程式碼之前, 我們需要回想一些日常面對的難題, 或則說不良體驗

在實現業務邏輯時, 我們往往都會遇到以下類似場景

確認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)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!