php - ORM 的算法是什么?

标签 php mysql orm

我一直在寻找在 php/mysql 应用程序中使用的 ORM。然而,没有一个能通过“hello world”测试引起我的注意。所以,我决定做一些研究并尝试编写我自己的自定义 ORM。但是,我一直无法找到在代码级别解释如何处理数据库关系的资源。 ORM 如何工作的概念很清楚,但是当我试图在代码中对其进行布局时,我不知道最好的方法是什么。最好是构建几个小查询还是为每个可能的场景构建一个复杂查询?欢迎对 ORM 的算法或架构有任何见解!

最佳答案

好吧,让我们即时制作一些 ORM 框架。当您标记 php 标签时,让我们用 PHP 对其进行编码。

但是在我们写之前我们必须知道一些基本概念或者一些基本术语 关于orm相关主题。在这个例子中,我们将有:

  1. ORM 框架 - ORM 框架负责处理服务器连接和服务器连接抽象。 (完整的 orm 框架还支持自动类到表的映射)。

  2. 数据层 - 这部分负责将类映射到表。 例如,数据访问层知道如何将特定类对象保存到实际表中,以及如何将特定表加载到特定类对象中。 (注意:几乎所有最新的 ORM 框架都可以让您远离这一层。例如 http://dbphp.net 或 Doctrine 将支持这一层的每个方面以及关系甚至自动表生成)。

  3. 业务层 - 该层包含您的实际工作类业务层通常代表模型或模型包含业务层

让我们从业务层或模型开始我们的示例。我们保存和加载用户的非常非常简单的项目将具有一级业务层:

<?php
class user
{
    public $id;
    public $name
    public function __construct ($name=null)
    {
        $this->name = $name;
    }
}
?>

如您所见,您的业务层或模型对其保存或加载的位置和方式一无所知。它只是处理项目相关的业务。这就是层名称的来源。

其次,让我们做一个简单的ORM框架:

<?php

//The connection link which can be changed any time
class link
{
    public $link;
    public function __construct ($hostname, $database, $username, $password)
    {
        $this->link = new \PDO ('mysql:host='.$hostname.';dbname='.$database, $username, $password);
        $this->link->query('use '.$database);
    }
    public function fetch ($query)
    {
        $result = $this->link->query($query)->fetch();
    }
    public function query ($query)
    {
        return $this->link->query($query);
    }
    public function error ()
    {
        return $this->link->errorInfo();
    }
}

//A structure which collects all link(s) and table/class handlers togather
class database
{
    public $link;
    public $tables = array ();
    public function __construct ($link)
    {
        $this->link = $link;
        table::$database = $this;
    }
}

//A basic table handler class
//In recent ORM frameworks they do all the default mappings
class table
{
    public static $database;
}
?>

正如您所注意到的,我们的 ORM 框架中的表类看起来很差。但如果这个框架是一个 复杂的框架,它还支持数据层,并具有处理任何表的所有功能。

但是因为你需要知道 ORM 框架在这种情况下是如何工作的,所以我们将制作数据层 我们业务层中每个类的处理程序。

所以这是您的数据层。它是如此 self 描述,以至于我认为它没有 需要任何文件:

<?php
class users extends table
{
    public function create ($row)
    {
        $return = new user ();
        $return->id = $row[0];
        $return->name = $row[1];
        var_export($row);
        return $return;
    }
    public function load ($id=null)
    {
        if ($id==null)
        {
            $result = self::$database->link->fetch("select * from users");
            if ($result)
            {
                $return = array();
                foreach ($result as $row)
                {
                    $return[$row[0]] = $this->create($row);
                }
                return $return;
            }
        }
        else
        {
            $result = self::$database->link->fetch("select * from users where id='".$id."'");
            if ($result)
            {
                return $this->create(reset($result));
            }
            else
            {
                echo ("no result");
            }
        }
    }
    public function save ($user)
    {
        if (is_array($save))
        {
            foreach ($save as $item) $this->save ($item);
        }
        if ($user->id==null)
        {
            return self::$database->link->query("insert into users set
                                                 name='".$user->name."'");
        }
        else
        {
            return self::$database->link->query("update users set name='".$user->name."'
                                                 where id='".$user->id."'");
        }
    }
    public function delete ($user)
    {
        self::$database->link->query ("delete from users where id='".$user->id."'");
    }
}
?>
  1. 最后让我们初始化$database对象
  2. 建立一些到一些 sql server 的链接。
  3. 将用户类处理程序添加到数据库。
  4. 使用它。

这是工作中的:

<?
$database = new database (new link('127.0.0.1', 'system_db', 'root', '1234'));
$database->tables['users'] = new users();

if (!$database->tables['users']->save (new user('Admin')))
{
    var_export($database->link->error());
}

var_export($database->tables['users']->load(2));
?>

如果您需要深入了解 php ORM 的其他概念,请随时访问

  1. 学说 - http://www.doctrine-project.org/ - 全功能复杂的 php ORM 框架
  2. db.php - http://dbphp.net/ - 功能齐全但非常简单的 php ORM 框架。

关于php - ORM 的算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3357826/

相关文章:

php - 热门标签

mysql - 用于填充网页的大量静态数据 - 存储在数据库中,还是静态的?

mysql - 将计算结果存储在数据库中?

java - JPA 和 toplink create-table 如果它们尚不存在?

.net - NHibernate 通过 where 选择将一张表映射到两个类

javascript - AJAX JQuery 上传图片

php - JQuery 和 AJAX 发布到 php,无需在 WordPress 中重新加载页面

php - 为什么 PHP 没有 block 级作用域?

mysql复制表?

python - ValueError : Attribute Users. 需要请求