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

1. KpuTuK (08.11.2013 / 19:11)
Добрый вечер!
Может конечно не сюда обращаюсь но все таки спрошу...
Не знаете ли вы какие нибудь учебники (статьи) или сами может что знаете по ORM...
Меня интересует только принцип работы (что делает с таблицами, куда помещает)
Облазил гугл с яндексом, хабр ни чего такого не нашел(
буду очень признателен)))

2. JustZero (08.11.2013 / 19:19)
1. KpuTuK, ну сперва вроде как нужно определиться какой ORM использовать
ссылка

Добавлено через 05:43 сек.
из популярных activerecord и doctrine2

3. KpuTuK (08.11.2013 / 19:43)
2. alexandr.sytnyk, я наверное не совсем правильно выразился....
я сам написать ее хочу но не знаю что она из себя представляет(((

4. Александр (08.11.2013 / 21:14)
http://design-pattern.ru/ - "Паттерны архитектуры источников данных"

5. Изнаур (08.11.2013 / 21:20)
3. KpuTuK, чтобы понять что она из себя представляет, изучи уже готовое

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

Добавлено через 02:13 сек.
Достаточно определить способ проекции свойств классов на реляционную базу данных, далее будет проще.

7. KpuTuK (09.11.2013 / 14:17)
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 сек.
конструктор получился ....

8. Артур (09.11.2013 / 15:21)
7. KpuTuK,То что ты показываешь, это ActiveRecord, более простое решение, не являющееся ORM. ORM это DataMapper.

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

9. KpuTuK (09.11.2013 / 17:09)
Уникальность объектов

а пример можно? а то выходит все чтото на подобие этого
<?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;
    }
}
?>


10. Артур (09.11.2013 / 17:16)
Можно и пример, если разберешся. Беру из рабочей системы, но скорее всего зависимости повиснут и использовать не получится

11. KpuTuK (09.11.2013 / 17:54)
10. Башка, большое спасибо))))

12. KpuTuK (25.11.2013 / 19:57)
10. Башка,
не разобрался т.к. все таки не понял смысла ОРМ....
(т. е. Сути)

13. Вантуз-мен (25.11.2013 / 22:24)
activerecord под php вроде норм, радует размер

14. KpuTuK (25.11.2013 / 23:30)
13. Vantuz, все дело в том что все предпочитают ОРМ вот и хочу разобраться что к чему а так можно и без всего этого обойтись грамотно составив запросы

15. Вантуз-мен (25.11.2013 / 23:33)
14. KpuTuK, orm это не только запросы к базе, это удобные связи между таблицами, работа с разными базами итд
да можно все самому, но если писать примитивно, то лишний гемор, а если делать круто, то зачем изобретать велоспиед

16. KpuTuK (25.11.2013 / 23:41)
15. Vantuz, ну тоесть как я понимаю берется содержимое таблицы через обычный sql помещается в обьект и дальше уже на уровне php происходят манипуляции?

17. Вантуз-мен (26.11.2013 / 01:47)
16. KpuTuK, в доктрине примерно так, в activerecord php не знаю, не пробовал еще

URL: https://visavi.net/topics/39433