了解表数据网关的工作原理与应用场景 | PHP 设计模式:表数据网关

本文介绍了表数据网关的定义与作用,它是一种设计模式,用于在应用程序和数据库之间传输数据。文章还详细解释了网关类的功能以及其在应用程序中的应用场景。阅读本文能够对表数据网关有更深入的了解,并了解它如何与数据库交互以及在业务类中的应用。

什么是表数据网关?

表数据网关是一种设计模式,它由在应用程序和数据库之间传输数据的类表示。因此,类只有持久化方法作为操作,即数据记录。

网关类

我们还将有另一个类,它是应用程序的业务类,每当需要在数据库中搜索或保存数据时就使用网关类。

产品类别

在大多数情况下,表数据网关处理关系模型,与数据库的主表具有 1:1 的关系。

关系模型

例子

第 1 步 - 目录系统:

📦Table_Data_Gateway
 ┣ 📂class
 ┃ ┣ 📜Product.php
 ┃ ┗ 📜ProductGateway.php
 ┣ 📂config
 ┃ ┗ 📜config.ini
 ┣ 📂database
 ┃ ┗ 📜product.db
 ┗ 📜index.php

第 2 步 - 数据库配置文件:

host =
name = database/product.db
user =
pass =
type = sqlite

第 3 步 - 数据库:

CREATE TABLE product(
  id INTEGER PRIMARY KEY NOT NULL,
  description TEXT,
  stock FLOAT,
  cost_price FLOAT,
  sale_price FLOAT,
  bar_code TEXT,
  date_register DATE,
  origin CHAR(1)
);

第 4 步 - ProductGateway 类:

<?php

class ProductGateway
{

    private static $conn;

    public function __construct()
    {

    }

    public static function setConnection(PDO $conn)
    {
        self::$conn = $conn;
    }

    public function find($id, $class = 'stdClass')
    {
        $sql = "SELECT * FROM product WHERE id = '$id'";
        print "$sql <br>";
        $result = self::$conn->query($sql);
        return $result->fetchObject($class);
    }

    public function all($filter = '', $class = 'stdClass')
    {
        $sql = "SELECT * FROM product";

        if( $filter )
        {
            $sql .= " WHERE $filter";
        }

        print "$sql <br>";
        $result = self::$conn->query($sql);
        return $result->fetchAll(PDO::FETCH_CLASS, $class);

    }

    public function delete($id)
    {
        $sql = "DELETE FROM product WHERE id = '$id'";
        print "$sql <br>";
        return self::$conn->query($sql);
    }

    public function save($data)
    {

        if( empty($data->id) )
        {
            $sql = "INSERT INTO product
                            (description, stock, cost_price, sale_price, bar_code, date_register, origin)
                            VALUES
                            ('{$data->description}',{$data->stock},{$data->cost_price},{$data->sale_price},
                                {$data->bar_code},'{$data->date-register}','{$data->origin}')";
        }
        else
        {
            $sql = "UPDATE product SET 
                            description = '{$data->description}', stock = '{$data->stock}', cost_price = '{$data->cost_price}',
                            sale_price = '{$data->sale_price}', bar_code = '{$data->bar_code}', date_register = '{$data->date_register}',
                            origin = '{$data->origin}'
                            WHERE id = '{$data->id}'";
        }

        print "$sql <br>";
        return self::$conn->exec($sql);

    }

}

第 5 步 - 产品类别:

<?php

    class Product
    {

        private $data;

        public function __construct()
        {

        }

        public static function setConnection( PDO $conn)
        {
            ProductGateway::setConnection($conn);
        }

        public function __get($prop)
        {
            return $this->data[$prop];
        }

        public function __set($prop, $value)
        {
            $this->data[$prop] = $value;
        }

        public static function find($id)
        {
            $gw = new ProductGateway;
          return $gw->find($id, 'Product');
        }

        public static function all($filter = '')
        {
            $gw = new ProductGateway;
          return $gw->all($filter, 'Product');
        }

        public function save()
        {
            $gw = new ProductGateway;
            return $gw->save( (object) $this->data);
        }

        public function delete()
        {
            $gw =  new ProductGateway;
            return $gw->delete($this->id);
        }

        public function getProfitMargin()
        {
            return (($this->sale_price - $this->cost_price)/$this->cost_price)*100;
        }

        public function registerPurchase($cost, $quantity)
        {
            $this->cost_price = $cost;
            $this->stock += $quantity;
        }

    }

测试

<?php

require_once 'class/Product.php';
require_once 'class/ProductGateway.php';

try
{
    $ini = parse_ini_file('config/config.ini');
    $dbname = $ini['name'];

    $conn = new PDO('sqlite:'.$dbname);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    Product::setConnection($conn);
    $product = new Product;

}
catch(Exception $e)
{
    print $e->getMessage();
}

在数据库中记录产品:

$product->description = 'Juice';
$product->stock = 8;
$product->cost_price = 12;
$product->sale_price = 18;
$product->bar_code = '123123123';
$product->origin = 'S';
$product->date_register = date('Y-m-d');
$product->save();

从数据库更新产品:

$update = $product::find(1);
$update->description = "Grape Juice";
$update->save($product);

列出产品:

foreach( $product::all() as $p )
{
  print $p->description . ' ';
  print $p->cost_price . ' ';
  print $p->sale_price . "<br>";
}

经营方式:

$p = $product::find(1);
$p->registerPurchase(24,2); //(cost,quantity)
$p->save($product);

print $p->getProfitMargin();


文章来源地址https://www.toymoban.com/article/417.html

到此这篇关于了解表数据网关的工作原理与应用场景 | PHP 设计模式:表数据网关的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/article/417.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包