• 构建自己的PHP框架--定义ORM的接口


    在上一篇博客中,我们抽象出了Controller的基类,实现了页面的渲染和返回JSON字符串的功能。

    那作为一个框架,我们现在还缺少什么?是的,大家应该已经注意到了,我们在这之前从来没有连接过数据库,我们缺少一个ORM(Object Relational Mapping)。

    在php中连接mysql有三种方式,分别是使用原生函数、mysqli扩展和PDO扩展,详细内容可以查看我之前的博客《PHP的学习--连接MySQL的三种方式》。

    我们要选择哪一种呢?考虑到作为一个框架不能仅支持一种数据库,我们就选择使用PDO。当然如果你确定你的框架只需要连接mysql数据库,也可以考虑使用mysqli。

    PDO支持如下的数据库:

    当然,这些数据库即使都可以使用PDO去连接使用,但在某些具体的情况下,还是有些许不同的,详情可参考PDO文档

    鉴于我电脑现在只安装了mysql,之后的code,只会测试mysql数据库,不会测试其他数据库。

    首先我们会将这些内容放在src/db文件夹中,我们需要定义一下接口,这里我们会先安最简单的来。

    我们需要实现什么?最简单的就是数据的增删改查。

    假设我们现在有一张article表,一个与之对应的Model Article,我们希望怎么用它呢?

    // 选出id为1的一篇文章
    $article = Article::findOne(['id' => 1]);
    
    // 选出status是unpublished的所有文章
    $articles = Article::findAll(['status' => 'unpublished']);
    
    // 将id为1的所有文章的status更新为published
    Article::updateAll(['id' => 2], ['status' => 'published']);
    
    // 删除所有id为1的文章
    Article::deleteAll(['id' => 2]);
    
    // $article是之前选出的id为1的文章
    // 更新它的属性status为unpublished
    $article->status = 'unpublished';
    // 保存更新到数据库
    $article->update();
    
    // 删除该文章
    $article->delete();
    
    // 创建一个新文章
    $article = new Article();
    $article->name = 'My first article';
    $article->status = 'published';
    // 将该文章保存到数据库中
    $article->insert();

    大概在上面列了一下,我们简单的ORM实现之后的使用,据此我们可以定义出如下接口:

    <?php
    namespace sfdb;
    
    interface ModelInterface
    {
        public static function tableName();
    
        public static function primaryKey();
    
        public static function findOne($condition);
    
        public static function findAll($condition);
    
        public static function updateAll($condition, $attributes);
    
        public static function deleteAll($condition);
    
        public function insert();
    
        public function update();
    
        public function delete();
    }

    该文件放在src/db文件夹下,这是我目前想到的最简单的接口,可能会有所遗漏,我们会在开发的时候不断完善。暂时我们会先按照这个实现。

    这是一个接口,之后我们会有一个Model类实现这个接口,然后所有的Model都继承这个Model类去实现。

     

    好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

    code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.4

    blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

  • 相关阅读:
    网络流 学习笔记
    回文自动机PAM 学习笔记
    后缀自动机SAM 学习笔记
    题解 CF1207G Indie Album
    题解 CF163E e-Government
    AC自动机 学习笔记
    CCF冬令营Day1上午
    不编译AC记录
    生成函数 抄写笔记
    FFT NTT 学习笔记
  • 原文地址:https://www.cnblogs.com/CraryPrimitiveMan/p/5203762.html
Copyright © 2020-2023  润新知