Heim > Datenbank > MySQL-Tutorial > So schreiben Sie Ihr eigenes Datenbankpaket (5)

So schreiben Sie Ihr eigenes Datenbankpaket (5)

PHPz
Freigeben: 2017-04-04 14:27:43
Original
1560 Leute haben es durchsucht


Grundidee

Bevor wir mit dem Codieren beginnen, müssen wir uns an einige der Probleme erinnern, mit denen wir täglich konfrontiert sind, oder an schlechte Erfahrungen

Bei der Implementierung von Geschäftslogik Wenn wir auf die folgenden ähnlichen Szenarien stoßen:

Überprüfen Sie, ob Herr A (id=233) Mitglied ist. Wenn ja, ändern Sie das Feld „Status“ auf „aktiv“, andernfalls deleteIt

wird normalerweise so geschrieben, wenn kein Framework vorhanden ist (der folgende Code überspringt die gesamte pdo-Logik)

// 首先查询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';
Nach dem Login kopieren

Beachten Sie, dass dies daran liegt, dass wir alle Schritte von pdo vereinfacht haben. Ich habe Tausende von Zeilen gesehen, die mit SQL-Anweisungen gefüllt sind, und die Rekonstruktion ist inkompetent
Warum müssen wir also so viel schreiben?

Reoperable Daten

Wenn die Daten zurückgegeben werden, werden sie in eine Instanz umgewandelt , die mit Funktion geliefert wird, kann bestimmte Operationen ausführen

Aus diesem Grund werden im Abfrageartikel die zurückgegebenen Daten zur Konvertierung in die Funktion cast()

verwenden Sie können dies nach der Kapselung tun

// 首先查询A先生的数据, 获取他的身份
$a = User::find(233);
// 判定是否存在该id和该id是否为会员
if($a & $a->member)
    // 是就修改字段
   $b = $a->update(['status'=>'active']);
else
   // 否就删除数据
   $b= $a->delete();
Nach dem Login kopieren
Als nächstes müssen wir darüber nachdenken

Wie ändert man die Datenbankdaten?

Dies ist meine eigene oberflächliche Antwort

In häufigen Situationen müssen wir bedingte Syntax verwenden, um den Datenbereich anzugeben, der geändert werden muss, und die Daten zu filtern, die nicht neu geschrieben werden müssen

Gemäß der obigen Erklärung gibt es drei Beispiele

  1. Geben Sie den Bereich überhaupt nicht an,

    Ändern Sie alle Daten in der Tabelle

    update Actor set first_name = 'new data'
    Nach dem Login kopieren
  2. Geben Sie den Bereich an, ändern Sie die Übereinstimmungsbedingungen. Mehrere Datenelemente

    update Actor set first_name = 'new data' where first_name like '%L%'
    Nach dem Login kopieren
  3. Geben Sie den Bereich an und ändern Sie das angegebene einzelne Datenelement entsprechend zum Identitäts-

    Schlüssel oder eindeutigen Schlüssel der Tabelle

    update Actor set first_name = 'new data' where actor_id = 10
    Nach dem Login kopieren
Basierend auf den oben genannten drei Typen können wir mit der Entwicklung der Aktualisierungsfunktion beginnen

PS: Ich kann die zu erweiterte Update-Anweisung aufgrund meiner Unerfahrenheit nicht verstehen/habe sie nie verwendet. Bitte hinterlassen Sie eine Nachricht


Builder.php

Update-Funktion in der letzten Zeile hinzufügen

// 改写数据库数据
    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);
    }
Nach dem Login kopieren

Grammar.php

CompileUpdate-Funktion in der letzten Zeile hinzufügen

    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");
    }
Nach dem Login kopieren

Model.php

Funktion zum Speichern hinzufügen, siehe Beispiel unten für die Verwendung

// 一种更快捷的update方式
    public function save() {
        return $this->update((array)$this->data);
    }
Nach dem Login kopieren

Beispiel

  • Ändern Sie die angegebenen Daten

$a = Actor::where('first_name', 'ANGELINA')
    ->update(['last_name'=>'changed']);
dd($a);
Nach dem Login kopieren
  • Dann betreiben Sie die Dateninstanz

$a = Actor::where('first_name', 'ANGELINA')
    ->first();
dd($a->update(['last_name'=>'again']));
Nach dem Login kopieren
  • Betreiben Sie die Dateninstanz erneut, eine andere Verwendung

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

$a->last_name = 'save';
dd($a->save());
Nach dem Login kopieren
das Ergebnis zurückgeben

boolean true
// 失败返回false
Nach dem Login kopieren


Das obige ist der detaillierte Inhalt vonSo schreiben Sie Ihr eigenes Datenbankpaket (5). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage