我一直在寻找在 php/mysql 应用程序中使用的 ORM。然而,没有一个能通过“hello world”测试引起我的注意。所以,我决定做一些研究并尝试编写我自己的自定义 ORM。但是,我一直无法找到在代码级别解释如何处理数据库关系的资源。 ORM 如何工作的概念很清楚,但是当我试图在代码中对其进行布局时,我不知道最好的方法是什么。最好是构建几个小查询还是为每个可能的场景构建一个复杂查询?欢迎对 ORM 的算法或架构有任何见解!
最佳答案
好吧,让我们即时制作一些 ORM 框架。当您标记 php 标签时,让我们用 PHP 对其进行编码。
但是在我们写之前我们必须知道一些基本概念或者一些基本术语 关于orm相关主题。在这个例子中,我们将有:
ORM 框架 - ORM 框架负责处理服务器连接和服务器连接抽象。 (完整的 orm 框架还支持自动类到表的映射)。
数据层 - 这部分负责将类映射到表。 例如,数据访问层知道如何将特定类对象保存到实际表中,以及如何将特定表加载到特定类对象中。 (注意:几乎所有最新的 ORM 框架都可以让您远离这一层。例如 http://dbphp.net 或 Doctrine 将支持这一层的每个方面以及关系甚至自动表生成)。
业务层 - 该层包含您的实际工作类业务层通常代表模型或模型包含业务层
让我们从业务层或模型开始我们的示例。我们保存和加载用户的非常非常简单的项目将具有一级业务层:
<?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."'");
}
}
?>
- 最后让我们初始化$database对象
- 建立一些到一些 sql server 的链接。
- 将用户类处理程序添加到数据库。
- 使用它。
这是工作中的:
<?
$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 的其他概念,请随时访问
- 学说 - http://www.doctrine-project.org/ - 全功能复杂的 php ORM 框架
- db.php - http://dbphp.net/ - 功能齐全但非常简单的 php ORM 框架。
关于php - ORM 的算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3357826/