ORM - миф. Когда остановиться?

weregod

unserializer
в моём случае вопрос об ORM вытек из вопроса о предоставления вменяемого API для системы :)
 

partizan

Новичок
Автор оригинала: triumvirat
Суть моего поста - понять, насколько нужно далеко можно и нужно заходить с ORM
Я для себя написал, с join-ами нормально работает. Не так сложно на самом деле
 

С.

Продвинутый новичок
AmdY: угу, я к этому и веду, ORM не тупой QueryBuilder, который зачастую мешает. В той же доктрине есть возможность строить произвольный запрос, но указать врапер для возвращаемых данных.
Тогда идем дальше и спрашиваем, зачем нам ORM, если QueryBuilder в нем тупой, а мы пользуемся только побочными свойствами враперов? Не проще ли обернуть наши 5-7 запросов в нативные классы, разработанные специально для данной конретной модели данных и ну его нафиг совсем бесполезный QueryBuilder. Или я что-то пропустил?
 

partizan

Новичок
У меня есть файлы с описанием таблиц, там перечислены поля таблици, а также, какие таблици присоединять нужно, по каким условиям и какие поля из присоединенных таблиц брать.

По этому описанию автоматически строется запрос
 

Духовность™

Продвинутый новичок
Короче, свою проблему решил. Никаких сложных ORM писать не пришлось, ограничился тем, что есть и получилось хорошо. Отчасти Макс натолкнул на решение:
у тебя есть результат запроса. Из него можно получить список полей и таблиц (многие db-клиенты позволяют это). Если у тебя одной таблице соответствует один объект, то написать реализацию - не проблема
Т.е была проблема - на основании сложного SQL, использующего JOIN, создать объекты моделей. Решаем элементарно: на основании результата создаем объекты моделей, имя информацию о таблицах. Т.е. почти тоже самое, что и mysql_fetch_row, только объектного содержания:

Код:
Array
(
    [0] => Array
        (
            [advert] => Model_Advert Object
                (
                    [data:protected] => Array
                        (
                            [id] => 119
                            [header] => Комната в 2-к квартире
                            ....
                        )
                )

            [country] => Model_Country Object
                (
                    [data:protected] => Array
                        (
                            [id] => 3
                            [name_ru] => Абхазия
                            ....
                        )
                )

            [region] => Model_Region Object
                (
                    [data:protected] => Array
                        (
                            [id] => 105
                            [name_ru] => Абхазия
                            ....
                        )
                )

            [city] => Model_City Object
                (
                    [data:protected] => Array
                        (
                            [id] => 3299
                            [name_ru] => Авадхара
                            ....
                        )
                )
        )
)
 

crocodile2u

http://vbolshov.org.ru
triumvirat
В моем подходе методы типа ActiveRecord::find() возвращают не объект ActiveRecord, а объект SQL-запроса, с которым можно еще пошаманить так, как нужно (мой query-object похож во многом на вариант из ZF): заджойнить таблицы, добавить какие-то доп. условия.
 

Духовность™

Продвинутый новичок
возвращают не объект ActiveRecord
а разве они должны возвращать объект ActiveRecord?

а объект SQL-запроса, с которым можно еще пошаманить
замечательно, но я все больше и больше абстрагируюсь от сырых данных и всё больше и больше склоняюсь к использованию объектов-сущностей. Т.е. если надо нам сделать SQL-запрос, то метод модели, выполяняющий этот запрос, должен возвращать не сырые данные - результат mysql_fetch_*, а объектное представление этих данных.
 

crocodile2u

http://vbolshov.org.ru
triumvirat
Ну вот, $user_mapper->findById(5); - разве не возвращает объект класса User ? Понятное дело, что конкретно объект ActiveRecord никто не возвращает - по всем статьям выходит, что ActiveRecord должен быть абстрактным.

метод модели, выполяняющий этот запрос, должен возвращать не сырые данные - результат mysql_fetch_*, а объектное представление этих данных.
Ну, а я использую PDO и PDOStatement, которому указываю нужный мне режим "прокрутки" результатов.
 
Сверху