Хорошо, давайте сделаем некоторые рамки ORM на лету.Когда вы пометили тег php, давайте закодируем его в PHP.
Но прежде чем писать его, мы должны знать некоторые базовые понятия или некоторую базовую терминологию о предметах, связанных с orm.В этом примере у нас будет:
ORM Framework - ORM Framework берет на себя ответственность позаботиться о соединениях с сервером и абстракциях соединения с сервером.(Полные платформы 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 в этом случае, мы сделаем обработчики уровня данных длякаждый класс в нашем бизнес-уровне.
Так что это ваш уровень данных.Он настолько информативен, что я думаю, что он не нуждается в какой-либо документации:
<?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.
- Добавить обработчик класса пользователя в базу данных.
- Использовать его.
Вот оно в работе:
<?
$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 вы можете посетить
- Doctrine - http://www.doctrine -project.org / - полнофункциональный комплекс php ORM framework
- db.php - http://dbphp.net/ - полнофункциональный, но очень простой фреймворк php ORM.