Изучение ORM на PHP

Печать RSS
445

Автор
Пацак
0
Добрый вечер!
Может конечно не сюда обращаюсь но все таки спрошу...
Не знаете ли вы какие нибудь учебники (статьи) или сами может что знаете по ORM...
Меня интересует только принцип работы (что делает с таблицами, куда помещает)
Облазил гугл с яндексом, хабр ни чего такого не нашел(
буду очень признателен)))
J

Оранжевые штаны
0
1. KpuTuK, ну сперва вроде как нужно определиться какой ORM использовать
ссылка

Добавлено через 05:43 сек.
из популярных activerecord и doctrine2
Изменил: JustZero (08.11.2013 / 19:20)
Автор
Пацак
0
2. alexandr.sytnyk, я наверное не совсем правильно выразился....
я сам написать ее хочу но не знаю что она из себя представляет(((
А

Оранжевые штаны
0
http://design-pattern.ru/ - "Паттерны архитектуры источников данных"
И

Пацак
0
3. KpuTuK, чтобы понять что она из себя представляет, изучи уже готовое
А

Оранжевые штаны
0
[url=http://109.172.57.193/library/Компьютер/Программирование/Разработка/Архитектура корпаративных программных приложений-Фаулер М-2006.pdf]56 стр.[/url]

Добавлено через 02:13 сек.
Достаточно определить способ проекции свойств классов на реляционную базу данных, далее будет проще.
Изменил: Вантуз-мен (08.11.2013 / 23:20)
Автор
Пацак
0
6. Башка, спасибо)))
То есть как я понял мы создаем общий класс (class myORM) и потом создаем дочерние на каждую таблицу (class myTable) и обращаемся к ней
<?php
$sql = new myORM('myTable');
// далее уже работаем с объектом класса myTable
$sql->select('id')->where('login', 'test');
// что составит sql запрос SELECT `id` FROM `myTable` WHERE `login` = 'test'
?>
(стр 186-187)
смысл тогда от нее...

Добавлено через 04:55 сек.
конструктор получился ....
Изменил: KpuTuK (09.11.2013 / 14:22)
А

Оранжевые штаны
0
7. KpuTuK,То что ты показываешь, это ActiveRecord, более простое решение, не являющееся ORM. ORM это DataMapper.

Вариантов несколько, объясню на примере моего. Для реализации ORM (как правило) нужно решить две задачи: ассоциативность и наследование. Другими словами как сохранять в базе единичные и множественные ссылки на объекты и как сохранять в базе наследование классов.
По первому вопросу нужно решить задачу уникальности объектов и преобразование объектов в уникальные ссылки. По второму вопросы есть решение либо на уровне одной таблицы, либо на уровне нескольких.
Теперь по каждому подробнее:
Уникальность объектов
Решается довольно просто. Реализуем интерфейс, на пример OID, который определяет методы setOID, getOID, getProxy и т.д. Те классы, которые реализуют уникальные объекты, должны реализовать этот интерфейс, а интерфейс определяет объекты, которые можно идентифицировать по некоторому уникальному свойству OID (на пример целочисленный идентификатор).
Создание ссылок
Тут тоже все просто. Есть объект с OID, для создания ссылки на него достаточно знать OID и имя класса этого объекта. Реализуем метод getLink который возвращает запись вида $имяКласса:OID. Если в будущем система встретит в базе такую строку, значит это ссылка на объект класса имяКласса с идентификатором OID и его легко восстановить.
Наследование на уровне одной таблицы
Это простое решение задачи. Есть класс B который наследуется от класса A. Для хранения обоих классов используется одна таблица. Если нужен класс C от класса B, нужно расширить таблицу. Нарушение 1 нормальной формы.
Наследование на уровне иерархии таблиц
Сложная задача. Нужно сделать так, чтобы один класс был в одной таблице, а другой в другой таблице, даже если они в одной иерархии наследования.
Изменил: Артур (09.11.2013 / 15:24)
Автор
Пацак
0
Уникальность объектов

а пример можно? а то выходит все чтото на подобие этого
<?php
interface OID {
    /**
     * Возвращает обьект по ид
     * @param int $id
     */
    public function getOID($id);
    /**
     * Сохраняет обьект по ид
     * @param type $id
     * @param type $obj
     */
    public function setOID($id, $obj);
}

class ORM implements OID {
    protected $obj_arr;
    protected function getOID($id) {
        return $this -> oid_arr[$id];
    }
    protected function setOID($id, $obj) {
        $this ->oid_arr[$id] = $obj;
    }
}
?>
А

Оранжевые штаны
0
Можно и пример, если разберешся. Беру из рабочей системы, но скорее всего зависимости повиснут и использовать не получится
Прикрепленные файлы:
orm_example.zip (101.54Kb)
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск