Heim  >  Artikel  >  Backend-Entwicklung  >  Dateneingabe in die Modellzeile der Datenquellenarchitektur

Dateneingabe in die Modellzeile der Datenquellenarchitektur

巴扎黑
巴扎黑Original
2016-11-12 10:55:381626Durchsuche

Hinweis: Wenn Sie es nicht verstehen, lesen Sie ihn bitte nicht. Dieser Artikel ist nicht für Java, daher können Java-Liebhaber ihn einfach überspringen.

1. Konzept

Zeilendaten-Gateway: Ein Objekt, das als Einstiegspunkt für einen einzelnen Datensatz in der Datenquelle dient, mit einer Instanz pro Zeile.

2. Einfache Implementierung der Zeilendateneingabe

Um das Verständnis zu erleichtern, implementieren wir es zunächst einfach:

<?php
/**
 * 行数据入口类
 */
class OrderGateway {
    /*定义元数据映射*/
    private $_name;
    private $_id;
 
    public function __construct($id, $name) {
        $this->setId($id);
        $this->setName($name);
    }
 
    public function getName() {
        return $this->_name;
    }
 
    public function setName($name) {
        $this->_name = $name;
    }
 
    public function getId() {
        return $this->_id;
    }
 
    public function setId($id) {
        $this->_id = $id;
    }
 
    /**
     * 入口类自身拥有更新操作
     */
    public function update() {
        $data = array(&#39;id&#39; => $this->_id, &#39;name&#39; => $this->_name);
 
        $sql = "UPDATE order SET ";
        foreach ($data as $field => $value) {
            $sql .= "`" . $field . "` = &#39;" . $value . "&#39;,";
        }
        $sql = substr($sql, 0, -1);
        $sql .= " WHERE id = " . $this->_id;
        return DB::query($sql);
    }
 
    /**
     * 入口类自身拥有插入操作
     */
    public function insert() {
        $data = array(&#39;name&#39; => $this->_name);
 
        $sql = "INSERT INTO order ";
        $sql .= "(`" . implode("`,`", array_keys($data)) . "`)";
        $sql .= " VALUES(&#39;" . implode("&#39;,&#39;", array_values($data)) . "&#39;)";
 
        return DB::query($sql);
    }
 
    public static function load($rs) {
        /* 此处可加上缓存 */
        return new OrderGateway($rs[&#39;id&#39;] ? $rs[&#39;id&#39;] : NULL, $rs[&#39;name&#39;]);
    }
 
}
 
/**
 * 为了从数据库中读取信息,设置独立的OrderFinder娄。
 */
class OrderFinder {
    public function find($id) {
        $sql = "SELECT * FROM order WHERE id = " . $id;
        $rs = DB::query($sql);
 
        return OrderGateway::load($rs);//这里返回的行对象
    }
 
    public function findAll() {
        $sql = "SELECT * FROM order";
        $rs = DB::query($sql);
 
        $result = array();
        if (is_array($rs)) {
            foreach ($rs as $row) {
                $result[] = OrderGateway::load($row);
            }
        }
 
        return $result;
    }
 
}
 
class DB {
 
    /**
     * 这只是一个执行SQL的演示方法
     * @param string $sql   需要执行的SQL
     */
    public static function query($sql) {
        echo "执行SQL: ", $sql, " <br />";
    }
}
 
/**
 * 客户端调用
 */
class Client {
    public static function main() {
        header("Content-type:text/html; charset=utf-8");
 
        /* 写入示例 */
        $data = array(&#39;name&#39; => &#39;start&#39;);
        $order = OrderGateway::load($data);
        $order->insert();
 
        /* 更新示例 */
        $data = array(&#39;id&#39; => 1, &#39;name&#39; => &#39;stop&#39;);
        $order = OrderGateway::load($data);
        $order->setName(&#39;xxxxxx&#39;);
        $order->update();
 
        /* 查询示例 */
        $finder = new OrderFinder();
        $order = $finder->find(1);
        echo $order->getName();
    }
}
 
Client::main();
?>

3. Betriebsmechanismus

●Zeilendaten Ein Eintrag ist ein Objekt, das einem einzelnen Datensatz sehr ähnlich ist, in dem jede Spalte in der Datenbank ein Feld ist.

●Zeilendateneingabe kann im Allgemeinen jede Konvertierung vom Datenquellentyp in den In-Memory-Typ erreichen.

●Der Zeilendateneintrag verfügt über keine Domänenlogik. Wenn er vorhanden ist, handelt es sich um einen aktiven Datensatz.

●Wie Sie im Beispiel sehen können, richten Sie zum Lesen von Informationen aus der Datenbank eine unabhängige OrderFinder-Klasse ein. Natürlich können Sie sich auch dafür entscheiden, keine neue Klasse zu erstellen und eine statische Suchmethode zu verwenden, diese unterstützt jedoch keinen Polymorphismus, der unterschiedliche Suchmethoden für unterschiedliche Datenquellen erfordert. Daher ist es am besten, das Objekt der Suchmethode hier separat festzulegen.

●Die Zeilendateneingabe kann nicht nur für Tabellen, sondern auch für Ansichten verwendet werden. Was Aufmerksamkeit erfordert, ist der Aktualisierungsvorgang der Ansicht.

● Es empfiehlt sich, „Metadatenzuordnung definieren“ im Code sichtbar zu machen, damit der gesamte Datenbankzugriffscode während des automatischen Erstellungsprozesses automatisch generiert werden kann.

4. Nutzungsszenarien

4.1 Transaktionsskript

kann Datenbankzugriffscode gut trennen und kann problemlos von verschiedenen Transaktionsskripten wiederverwendet werden. Möglicherweise stellen Sie jedoch fest, dass die Geschäftslogik in mehreren Skripten wiederholt wird, und diese Logik kann bei der Zeilendateneingabe nützlich sein. Durch die kontinuierliche Verschiebung dieser Logik werden Zeilendateneinträge zu aktiven Datensätzen, wodurch die Duplizierung der Geschäftslogik reduziert wird.

4.2 Domänenmodell

Wenn Sie die Struktur der Datenbank, aber nicht die Domänenlogik ändern möchten, ist die Verwendung der Zeilendateneingabe eine gute Wahl. In den meisten Fällen eignen sich Data Mapper besser für Domänenmodelle.

Zeilendateneinträge können in Verbindung mit Datenzuordnungen verwendet werden. Obwohl dies etwas überflüssig erscheint, kann dieser Ansatz nützlich sein, wenn Zeilendateneinträge automatisch aus Metadaten generiert und Datenzuordnungen manuell implementiert werden.

4.3 Tischmodul (nicht berücksichtigt)


Stellungnahme:
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