Maison > base de données > tutoriel mysql > Comment écrire votre propre package de base de données (5)

Comment écrire votre propre package de base de données (5)

PHPz
Libérer: 2017-04-04 14:27:43
original
1566 Les gens l'ont consulté


Idée de base

Avant de commencer à coder, nous devons rappeler certains des problèmes auxquels nous sommes confrontés quotidiennement, ou de mauvaises expériences

Lors de la mise en œuvre de la logique métier Quand, nous rencontrons souvent les scénarios similaires suivants

Confirmez si M. A (id=233) est membre Si oui, modifiez le champ 'statut' en 'actif', sinon . deleteIt

est généralement écrit comme ceci lorsqu'il n'y a pas de framework (le code suivant ignore toute la logique 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';
Copier après la connexion

Notez que c'est parce que nous avons simplifié toutes les étapes de pdo. Pensez simplement à une logique métier plus complexe. J'ai vu des milliers de lignes remplies d'instructions SQL. La lisibilité du code est égale à 0 et la reconstruction est incompétente.
Alors, pourquoi avons-nous besoin d'écrire autant ? Cela peut être simplifié

Données réexploitables

Lorsque les données sont renvoyées, elles sont converties en instance ! , qui vient avec la Fonction peut effectuer certaines opérations

C'est pourquoi dans l'article de requête, les données renvoyées seront mises dans la fonction cast() pour conversion

utilisation Vous pouvez le faire après l'encapsulation

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

Ensuite, nous devons réfléchir à

Comment modifier les données de la base de données ?

Ceci est ma propre réponse superficielle

Dans les situations courantes, nous devons utiliser une syntaxe conditionnelle pour spécifier la plage de données qui doivent être modifiées et filtrer les données qui n'ont pas besoin d'être réécrites

Selon la description ci-dessus, il existe trois exemples

  1. Ne précisez pas du tout la plage, Modifiez toutes les données du tableau

    update Actor set first_name = 'new data'
    Copier après la connexion
  2. Spécifiez la plage, modifiez les conditions de correspondance Plusieurs éléments de données

    update Actor set first_name = 'new data' where first_name like '%L%'
    Copier après la connexion
  3. spécifiez la plage et modifiez l'élément de données spécifié en fonction à la clé d'identité ou à la clé unique de la table

    update Actor set first_name = 'new data' where actor_id = 10
    Copier après la connexion

Sur la base des trois types ci-dessus, nous pouvons commencer à développer la fonction de mise à jour.
PS : Je n'arrive pas à comprendre/je n'ai jamais utilisé l'instruction de mise à jour trop avancée en raison de mon inexpérience. Bienvenue pour laisser un message


Builder.php

Ajouter une fonction de mise à jour dans la dernière ligne<.>

// 改写数据库数据
    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);
    }
Copier après la connexion

Grammar.php

Ajouter la fonction compileUpdate dans la dernière ligne

    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");
    }
Copier après la connexion

Model.php

Ajouter une fonction de sauvegarde, voir l'exemple ci-dessous pour l'utilisation

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

Exemple

  • Modifier les données spécifiées

$a = Actor::where('first_name', 'ANGELINA')
    ->update(['last_name'=>'changed']);
dd($a);
Copier après la connexion
  • Ensuite, faites fonctionner l'instance de données

$a = Actor::where('first_name', 'ANGELINA')
    ->first();
dd($a->update(['last_name'=>'again']));
Copier après la connexion
  • Faites fonctionner à nouveau l'instance de données, une autre utilisation

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

$a->last_name = 'save';
dd($a->save());
Copier après la connexion
retourner le résultat

boolean true
// 失败返回false
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal