ホームページ  >  記事  >  データベース  >  独自のデータベース パッケージを作成する方法 (5)

独自のデータベース パッケージを作成する方法 (5)

PHPz
PHPzオリジナル
2017-04-04 14:27:431494ブラウズ


基本的な考え方

コードを始める前に、日々直面する問題や嫌な経験を思い出す必要があります

ビジネスロジックを実装する際、以下のような同様のシナリオに遭遇することがよくあります

Aさんに確認( id=233) メンバーですか? もしそうなら、フィールド 'status' を 'active' に変更します。そうでない場合は、 削除します フレームワーク

がない場合、通常このように書かれます (すべての
pdo

をスキップします)次のコード Logic)

// 首先查询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 のすべてのステップを簡素化したためであることに注意してください。より複雑なビジネス ロジックについて考えてみると、コードの可読性は 0 に等しくなります。 再構築は無能ですそれでは、なぜそんなに書く必要があるのでしょうか?

再操作可能なデータ

データが返されると、インスタンスに変換されます
。 、特定の操作を実行できます

これが、返されたデータがクエリ記事での変換のために関数 Cast() に入れられる理由ですカプセル化を使用した後にこれを行うことができます

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

データベースのデータを変更する方法について

これは私自身の表面的な答えです

一般的な状況では、条件付き構文を使用して、変更する必要があるデータの範囲を指定し、変更するデータをフィルターする必要があります書き換える必要はありません

上記の説明によると例は3つあります

範囲を一切指定しない、

テーブル内のデータを全て変更する

    update Actor set first_name = 'new data'
  1. 範囲を指定する、複数個を変更する条件に一致するデータ

    update Actor set first_name = 'new data' where first_name like '%L%'
  2. の範囲を指定し、テーブルのアイデンティティ

    key

    または一意のキーに基づいて指定された単一の部分を変更します Data
  3. update Actor set first_name = 'new data' where actor_id = 10
  4. 上記の3種類に従って、開発を開始できますupdate 関数、追記: 経験が浅いため、高度すぎる 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);
    }

文法.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);
    }
Example


変更 データを指定します

$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 中国語 Web サイトの他の関連記事を参照してください。

        声明:
        この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。