ORM

nerezus

Вселенский отказник
ORM

Собственно надоело с базой напрямую работать - затратно как-то.

Кто какие реализации посоветовать может?
 

Wicked

Новичок
Затратно - в каком смысле?

Кстати, на форуме ORM подробно обмусоливался уже не раз. Так что может обратиться к поиску?
 

nerezus

Вселенский отказник
> Затратно - в каком смысле?
по времени

сейчас эти погуглю
 

Wicked

Новичок
nerezus
по времени чего? Если времени разработки, то вопрос ок. Но время работы скрипта ORM-ам свойственно увеличивать.
 

Фанат

oncle terrible
Команда форума
да ладно, про разработку-то.
скопипастить два куска кода никак не дольше, чем вызвать хитроспроектированную функцию, предварительно установив пяток параметров
 

zerkms

TDD infected
Команда форума
*****
ты когда-нибудь пробовал пользоваться ОРМами? из твоего утверждения - кажется что нет

пример "из жизни":

$news = $newsMapper->searchById(666);
$news->setTitle('new changed title');
$newsMapper->save($news);

имхо вполне понятный и читабельный код даже для того, кто ничего о конкретной реализации ОРМа не слышал
и это уж куда быстрее чем взять и "скопипастить" кусок "похожего" функционала из другого файла, при этом обеспечив себя дебагом минут на 10
 

jonjonson

Охренеть
zerkms, для меня этот код не читаем. Мне проще написать так:
PHP:
function updateTitle($id, $title)
{
    $db =& DataBase::getInstance();
    $title = $db->realEscapeString($title);
    $sql_string = "UPDATE news".
        " SET title = '{$title}'".
        " WHERE id = '{$id}'";
    $db->query($sql_string);
}
Тоже пример из жизни.
 

itprog

Cruftsman
jonjonson
а что в коде не читаемо?
ps: вообще несерьезное твое "проще" :)
 

Андрейка

Senior pomidor developer
zerkms
а в указанном жизненном орм
$news->setTitle('new changed title');

примерно так реализована?
PHP:
class A {
	
	function __call($func, $args) {
		
		if (strncmp($func, 'set', 3)===0) {
			$param = strtolower(substr($func, 3));
			$this->$param = $args[0];
		}
	}
}
 

itprog

Cruftsman
Примерно да, только без strncmp, а используя данные из map-конфигов (где выставляются соответствия между полями таблицы и методами)
ps: посмотреть реализацию можно по ссылке в подписи :)
 

jonjonson

Охренеть
Автор оригинала: itprog
а что в коде не читаемо?
Для новичка не однозначно, что работа идёт с БД.

$news = $newsMapper->searchById(666);
Это запрос записи по id или начало построения запроса, который завершается этим
А вот тут
$news->setTitle('new changed title');
данные эскейпятся?

Автор оригинала: itprog
ps: вообще несерьезное твое "проще" :)
И чем не серьёзное?

Я понимаю, что ORM должен скрывать особенности работы с БД. Скажем, пусть это мой личный комплекс, но мне проще мыслить SQL нежели методами состоящими из не всегда логически понятных приставок (в контексте совершаемого действия), сросшихся с именами полей. :)
 

zerkms

TDD infected
Команда форума
Для новичка не однозначно, что работа идёт с БД.
и это ли не супер? ;) работа с данными скрыта, а тебе собственно - пофигу что и как работает, пользуйся результатами, программируй логику приложения

Это запрос записи по id или начало построения запроса, который завершается этим
дословно:
новость = маппер->искатьПоИд
(имхо, опять же, понятно что это возвращение инстанции новости)

данные эскейпятся?
угумс
 

jonjonson

Охренеть
Автор оригинала: zerkms
и это ли не супер? ;) работа с данными скрыта, а тебе собственно - пофигу что и как работает, пользуйся результатами, программируй логику приложения
В том то и дело, что как только начинаешь использовать ORM, так сразу приходиться лесть в изучение его реализации. Иначе такого наворотишь... :)
 

zerkms

TDD infected
Команда форума
В том то и дело, что как только начинаешь использовать ORM, так сразу приходиться лесть в изучение его реализации
сомнительное утверждение
тебе как пользователю предлагается документация с описанием интерфейсов. этого тебе должно быть достаточно для использования его

(как обычно говорят в таких случаях - для того чтобы пользоваться компьютером, нужно ли знать как именно он устроен?)
 

itprog

Cruftsman
jonjonson
т.е. проще от проекта к проекту писать, отлаживать такие функции вместо того, чтобы один раз прочитать мануал?
В твоей функции, например, возможна SQL-инъекция через $id..
 

jonjonson

Охренеть
Автор оригинала: itprog
В твоей функции, например, возможна SQL-инъекция через $id..
Вы уверены? Подумайте ещё раз хорошенько :)

-~{}~ 09.07.07 13:18:

Автор оригинала: zerkms
(как обычно говорят в таких случаях - для того чтобы пользоваться компьютером, нужно ли знать как именно он устроен?)
Программист не тривиальный пользователь.
Кроме того приведён простой пример использования ORM. А теперь отпишите на нём выборку из трёх связанных таблиц, да ещё не всех полей для каждой таблицы, да ещё с преобразованием значений нескольких из выбираемых полей.
Посмотрим на простоту.


И ещё. Есть ли стандарт для ORM именований?

removeById()... deleteById()... dropById()...
 

zerkms

TDD infected
Команда форума
PHP:
function updateTitle($id, $title)
{
    $db =& DataBase::getInstance();
    $title = $db->realEscapeString($title);
    $sql_string = "UPDATE news".
        " SET title = '{$title}'".
        " WHERE id = '{$id}'";
    $db->query($sql_string);
}

updateTitle("4' OR TRUE", 'превед медвед');
покажи нам сгенерированный запрос

Программист не тривиальный пользователь.
программист - как раз таки пользователь ОРМа

А теперь отпишите на нём выборку из трёх связанных таблиц, да ещё не всех полей для каждой таблицы, да ещё с преобразованием значений нескольких из выбираемых полей.
ты не понимаешь смысла ОРМа. его цель - упростить РУТИННЫЕ операции с БД. При этом ОРМ также может позволять делать и прямые запросы к БД.
По поводу 3 связанных таблиц - всё делается автоматом средствами орм, связи описываются в схеме БД (в ini)
по поводу "не всех полей" - тебя это не должно касаться, тебе в результате выполнения приходят объекты с методами, о "полях" ты даже не догадываешься
по поводу преобразования - тоже не проблема (в случае с тем, чем пользуюсь я)


И ещё. Есть ли стандарт для ORM именований?
ОРМ это не конкретная имплементация, а парадигма. Каждый автор ОРМ волен именовать методы как хочет, равно как и всё остальное делать так - как удобно.
 

jonjonson

Охренеть
Автор оригинала: zerkms
PHP:
updateTitle("4' OR TRUE", 'превед медвед');
В том-то и дело, что функция вырвана из контекста - это раз.
Второе она принимает валидированные данные. Сама же по всей логике приложения она не должна их валидировать. :)

ты не понимаешь смысла ОРМа. его цель - упростить РУТИННЫЕ операции с БД.
и
При этом ОРМ также может позволять делать и прямые запросы к БД.
Тут играть. Тут не играть. Тут рыба лежала...

По поводу 3 связанных таблиц - всё делается автоматом средствами орм, связи описываются в схеме БД (в ini)
и утверждение, что ORM облегчает понимание кода противоречат друг другу.
Ни хрена себе упростили и сделали понятным код! Это мы опять пишем SQL, но через жопу. :)

по поводу "не всех полей" - тебя это не должно касаться, тебе в результате выполнения приходят объекты с методами, о "полях" ты даже не догадываешься
по поводу преобразования - тоже не проблема (в случае с тем, чем пользуюсь я)
Так если я как программист не напишу, то что мне нужно, то как это за меня сделает ORM. Или он медиум?

ОРМ это не конкретная имплементация, а парадигма. Каждый автор ОРМ волен именовать методы как хочет, равно как и всё остальное делать так - как удобно.
Ага, учим диалекты китайского или живём в одной провинции. :)


Да и примера не последовало. Видимо не так прост ORM. :))
 

zerkms

TDD infected
Команда форума
Ни хрена себе упростили и сделали понятным код! Это мы опять пишем SQL, но через жопу.
нет, не пишем

Так если я как программист не напишу, то что мне нужно, то как это за меня сделает ORM. Или он медиум?
тут варианта два:
1. ты продолжаешь язвить и разговор заканчивается
2. ты общаешься как цивилизованный человек с цивилизованным человеком

Сама же по всей логике приложения она не должна их валидировать.
а если всё таки подумать - кто как не класс, работающий с конкретной предметной областью знает лучше - какие данные валидные, а какие нет. вполне нормальной практикой является перенос валидации именно в ДО, или ты считаешь, что размазывать валидацию по всему коду лучше, чем сосредоточить в одном месте, где собственно ей и полагается быть?

Ага, учим диалекты китайского или живём в одной провинции.
т.е. ты хочешь сказать что и твой код, например
$title = $db->realEscapeString($title);
сплошь состоит из нативных функций? а в ПДО например есть метод quote(). т.е. ты тоже пользуешься "другим диалектом", но сам это анормальным не считаешь. ты уж определись да

Да и примера не последовало. Видимо не так прост ORM
вообще то в начале я привёл пару названий ОРМ, если тебе это действительно интересно - нагугли офсайты и посмотри там примеры. здесь тема (конечно же холиварная) - вообще об ОРМ, а не о конкретной библиотеке

отвечая в твоей же манере - ты просто не постиг его дао
до свидания, рядовой шутник (с)
 
Сверху