<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title>Хабрахабр / Комментарии к посту «DaBase — не очередная ORM для PHP» в блоге «PHP»</title>
	<link>http://habrahabr.ru/rss/post/72731/</link>
	<description><![CDATA[Новые комментарии к посту «DaBase — не очередная ORM для PHP» в блоге «PHP»]]></description>
	<language>ru</language>
	<managingEditor>editor@habrahabr.ru</managingEditor>
	<generator>habrahabr.ru</generator>
	<pubDate>Sat, 11 Feb 2012 12:26:19 GMT</pubDate>
	<lastBuildDate></lastBuildDate>
	<image>
		<link>http://habrahabr.ru/</link>
		<url>http://habrahabr.ru/i/logo.gif</url>
		<title>Хабрахабр</title>
	</image>
	

	
	
	
	
	
		
	
		<item>
			<title>29.10.2009 18:30:29 developer</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2125090</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2125090</link>
			<description><![CDATA[с рефлексией можно и без статик в 5-ке старой. короче без LSB]]></description>
			<pubDate>Thu, 29 Oct 2009 18:30:29 GMT</pubDate>
			<author>developer</author>
		</item>
	

	
		<item>
			<title>19.10.2009 19:12:53 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2090318</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2090318</link>
			<description><![CDATA[Добавил возможность создания кастомных Getter-ов унаследованных от DaBase_Getter. Тогда вот этот ваш случай вообще просто решается:<br/>
<br/>
создаёте класс <br/>
<br/>
<code>class GoldUsers extends DaBase_Getter {<br/>
 <br/>
 protected $tableName = 'users';<br/>
 protected $objectsClass = 'User';<br/>
 <br/>
 protected function postInit() {<br/>
 $this-&gt;isGold(true);<br/>
 }<br/>
}<br/>
</code><br/>
<br/>
И всё, теперь обращаясь: $db-&gt;goldUsers-&gt;get() всегда получаете геттер класса GoldUsers c предустановленным фильтром.<br/>
]]></description>
			<pubDate>Mon, 19 Oct 2009 19:12:53 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>19.10.2009 09:05:38 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2088317</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2088317</link>
			<description><![CDATA[&gt; YAML не пробовали? <br/>
<br/>
Нет, хотя наверное стоило.<br/>
<br/>
&gt; Можно конкретики? Памяти слишком много отжиралось, слишком долго выполнялось? Что именно?<br/>
<br/>
Памяти и процессорного времени. В проекте, в котором очень высокая нагрузка на фронтенд, более 500kb Propel-овского кода начинают давать о себе знать. Даже использование opcode-ного кеширование не спасало. <br/>
<br/>
&gt; Как сделать фильтр по этой колонке. <br/>
<br/>
$db-&gt;users-&gt;filter('order', 5, '&gt;')-&gt;get();<br/>
<br/>
]]></description>
			<pubDate>Mon, 19 Oct 2009 09:05:38 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>19.10.2009 07:51:27 remal</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2088130</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2088130</link>
			<description><![CDATA[<blockquote>В том, что при создании запроса генерится слишком много левых (Propel-овских объектов), в том, что сам код перевешивает код всей системы и т.д.</blockquote>Можно конкретики? Памяти слишком много отжиралось, слишком долго выполнялось? Что именно?<br/>
<br/>
Я правильно понимаю, что проект был настолько оптимизирован (и база тоже), что ORM стала реально узким местом?<br/>
<br/>
<blockquote>$db-&gt;users-&gt;order('order')-&gt;get(); // :) </blockquote>Я криво написал, а вы не поняли. Как сделать фильтр по этой колонке. Сейчас фильтрация у вас идет методами с таким же названием как и колонка. Метод order же уже существует, а, значит, по значению эту колонку будет не отфильтровать.]]></description>
			<pubDate>Mon, 19 Oct 2009 07:51:27 GMT</pubDate>
			<author>remal</author>
		</item>
	

	
		<item>
			<title>19.10.2009 01:09:19 VolCh</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087643</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087643</link>
			<description><![CDATA[&gt;А мне вот не нравится их синтексис XML-конфига<br/>
<br/>
YAML не пробовали?]]></description>
			<pubDate>Mon, 19 Oct 2009 01:09:19 GMT</pubDate>
			<author>VolCh</author>
		</item>
	

	
		<item>
			<title>19.10.2009 00:01:15 w999d</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087608</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087608</link>
			<description><![CDATA[Если бы в заголовке не было слова ORM…<br/>
<br/>
С моей точки зрения главное — ORM должна обеспечить разработчика таким функционалом, чтобы ему не пришлось написать ни строчки SQL (оставив такую возможность).<br/>
<br/>
На самом деле «DaBase» до ORM допилить не так сложно, <i>у меня был подобный прототип — <a href="http://code.google.com/p/zenmysql/">code.google.com/p/zenmysql/</a> Вторая версия, которую вылизываю последние пару недель теперь полностью поддерживает CRUD и умеет возвращать нужные типы объектов. В сочетании с генератором классов — теперь объект сам знает свои PK, список полей и дефолтных значений, связи с другими таблицами, поля можно оборачивать в другие классы с настройкой свойств. Но это не набор функционала любой ORM. </i><br/>
<br/>
Наворачивать можно до бесконечности, но такие обертки для баз, таблиц, рядов в основе, как DaBase — очень помогают при написании собственно, самой ORM. <i>Также, в моем случае, основной задачей первой версии zenmysql было получение ссылок (mysql link resource) на 3-4 базы данных одновременно, и абстракция mysql_query($sql, $dblink) при каждом запросе в виде $table-&gt;q($sql)</i>]]></description>
			<pubDate>Mon, 19 Oct 2009 00:01:15 GMT</pubDate>
			<author>w999d</author>
		</item>
	

	
		<item>
			<title>18.10.2009 23:51:57 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087603</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087603</link>
			<description><![CDATA[Т.е. ORM на бизнес логику завязывать нехорошо, вы согласны?<br/>
<br/>
А к чему тогда эти ваши слова:<br/>
&gt; ORM по определению должна абстрагировать бизнес-логику от SQL<br/>
<br/>
API должно абстрагировать бизнес логику от ORM, а ORM в свою очередь в идеале должно абстрагировать способ хранения и доступа к данным.]]></description>
			<pubDate>Sun, 18 Oct 2009 23:51:57 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 23:46:25 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087601</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087601</link>
			<description><![CDATA[&gt; Для RedBean так же как и у вас, не нужно писать конфигов или схему БД. Достаточно списка классов, которым на ходу можно присваивать любые поля.<br/>
<br/>
Стоп. Опять кто-то не внимательно руководство читал. Для DaBase не нужен никакой список классов!<br/>
<br/>
Вы конечно извинете, но я уже устал тут разглагольствовать. Чисто субъективно этот Redbeans местами чепушной какой-то. И не надо говорить, что он удобней чем DaBase т.к. банально судя по примерам которые вы привели это не так.<br/>
<br/>
Короче, если вам так нравится этот ORM, то напишите о нём полноценную статью на хабре, лично мне будет очень интересно почитать. А критика, будьте уверены, народ вам ещё много чего «хорошего» про него расскажет.]]></description>
			<pubDate>Sun, 18 Oct 2009 23:46:25 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 23:12:25 nayjest</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087583</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087583</link>
			<description><![CDATA[Я не говорил, что он лучше всех прочих ORM, он выполняет примерно те же задачи, что и ваш DaBase + немного больше.<br/>
<br/>
Для RedBean так же как и у вас, не нужно писать конфигов или схему БД. Достаточно списка классов, которым на ходу можно присваивать любые поля.<br/>
<br/>
require('oodb.php');<br/>
<br/>
RedBean_Setup::kickstartDev('', 'mysql:host=localhost;dbname=mydatabase' );<br/>
//В режиме разработки по ходу того что мы будем делать далее создадутся соответствующие таблицы в БД, так же их структура может меняться налету.<br/>
Есть и режим, в котором изменение структуры БД запрещено — уже для продакшена.<br/>
<br/>
Redbean_OODB::Gen('Post,Comment');//теперь у нас есть классы Page,Post,Comment<br/>
<br/>
$p = new Post;<br/>
$p-&gt;caption='bla-bla-bla';<br/>
$p-&gt;setRating(1500);//можно и методами<br/>
$p-&gt;text=$some_text;<br/>
$c = new Comment;<br/>
$c-&gt;text='qweqweqwe';<br/>
$p-&gt;add($c);<br/>
$id = $p-&gt;save();<br/>
<br/>
Доступ к сохранённому экземпляру:<br/>
$p2 = new Post( $id );<br/>
echo $p2-&gt;caption;<br/>
$p2-&gt;author='Valera';<br/>
$p2-&gt;save(); — вот теперь в структуру таблицы будет добавлено новое поле!<br/>
<br/>
Можно импортировать поля из массива:<br/>
$employee-&gt;import( array('name'=&gt;'John','badge'=&gt;123) );<br/>
<br/>
Или экспортировать в массив:<br/>
$arr = $bean-&gt;exportAsArr();<br/>
<br/>
Есть поиск по SQL:<br/>
$persons = Person::where(' name LIKE {nm} and age &gt; {ag} order by customerid asc ',<br/>
array('name'=&gt;'Geor%','age'=&gt;50))-&gt;getBeans();<br/>
<br/>
Просто получить все записи из таблицы (массив массивов) можно через:<br/>
$persons = Person::findAll();<br/>
<br/>
Можно также хранить древовидные структуры, используется Ad.List<br/>
<br/>
И многое другое]]></description>
			<pubDate>Sun, 18 Oct 2009 23:12:25 GMT</pubDate>
			<author>nayjest</author>
		</item>
	

	
		<item>
			<title>18.10.2009 23:07:41 nikelin</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087577</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087577</link>
			<description><![CDATA[Я считаю правильнеым завязывать бизнес логику на модели и контроллеры, да. ORM просто предоставляет средства. О нём в идеальном случае я и знать-то не должен, как это проиходит в случае с Java Persistence Objects.<br/>
]]></description>
			<pubDate>Sun, 18 Oct 2009 23:07:41 GMT</pubDate>
			<author>nikelin</author>
		</item>
	

	
		<item>
			<title>18.10.2009 23:02:41 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087568</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087568</link>
			<description><![CDATA[А вы считаете правильным завязывать бизнес логику на ORM? Я сражён.]]></description>
			<pubDate>Sun, 18 Oct 2009 23:02:41 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 23:01:03 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087565</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087565</link>
			<description><![CDATA[Ну как всё просто, вот только они там в документации чайникам красненьким не подсветили, чтобы те были осторожны с данными, которые на вход этого метода отсылают. Бедные чайники…]]></description>
			<pubDate>Sun, 18 Oct 2009 23:01:03 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 22:58:36 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087564</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087564</link>
			<description><![CDATA[&gt; Вы хотите сказать, что Propel был узким местом вашего проекта? В чем именно? <br/>
<br/>
В том, что при создании запроса генерится слишком много левых (Propel-овских объектов), в том, что сам код перевешивает код всей системы и т.д.<br/>
<br/>
&gt; В том же самом пропеле я в одном XML конфиге получаю структуру базы. Легко, доступно и в одном месте.<br/>
<br/>
А мне вот не нравится их синтексис XML-конфига, я в SQLYog быстрее базу заделаю. А вообще это всё клёво если с нуля систему проектировать, а если готовая — пилим гири?<br/>
<br/>
&gt; Расскажите как мне работать с колонкой order, если она есть в таблице? Как мне сделать условие «IS NOT NULL»?<br/>
<br/>
$db-&gt;users-&gt;order('order')-&gt;get(); // :) <br/>
<br/>
&gt; Я бы не стал сравнивать клиентскую часть и серверный код. <br/>
<br/>
Тут вопрос не в клиентской части и серверной, а в том какими граблями волосы расчёсывать :)]]></description>
			<pubDate>Sun, 18 Oct 2009 22:58:36 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 22:52:09 w999d</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087561</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087561</link>
			<description><![CDATA[полагаю, $this-&gt;adapter-&gt;escape($type) — экранирование, а $ids — числа]]></description>
			<pubDate>Sun, 18 Oct 2009 22:52:09 GMT</pubDate>
			<author>w999d</author>
		</item>
	

	
		<item>
			<title>18.10.2009 21:44:24 remal</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087465</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087465</link>
			<description><![CDATA[<blockquote>Спорный вопрос. Properl & Doctrine & etc это полноценные и тяжелые ORM, они требуют полной спецификации базы и соответствующей конкретики в обращении с ней</blockquote>В том же самом пропеле я в одном XML конфиге получаю структуру базы. Легко, доступно и в одном месте.<br/>
<br/>
<blockquote>Вы высоко нагруженные проекты на Propel когда-нибудь профайлили? Случается, что в конечном счёте приходится или Propel откручивать, или вторую серверную стойку на Xeon-ах прикручивать.</blockquote>Вы хотите сказать, что Propel был узким местом вашего проекта? В чем именно? Кроме кривой системы кеширования, которую можно всегда заменить, я не могу представить что там может тормозить. Быть может, стоило, наконец, освоить какой-то другой язык кроме PHP, если ORM библиотека является узки местом?<br/>
<br/>
<blockquote>Удобнее? Я считаю да, во многих моментах удобнее. Надо будет в топике подправить, что сие не есть Enterprise-решение</blockquote>Расскажите как мне работать с колонкой order, если она есть в таблице? Как мне сделать условие «IS NOT NULL»?<br/>
<br/>
<blockquote>А это вообще возможно? Простите, но как вы себе представляете пылесос и фен в одном флаконе?</blockquote>Видел пару раз удачные экземпляры, но, к сожалению, ссылок найти сейчас не смог.<br/>
<br/>
<blockquote>Скажите это тем, кто использует Twitter вместо Livejournal</blockquote>Я бы не стал сравнивать клиентскую часть и серверный код.]]></description>
			<pubDate>Sun, 18 Oct 2009 21:44:24 GMT</pubDate>
			<author>remal</author>
		</item>
	

	
		<item>
			<title>18.10.2009 21:08:19 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087399</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087399</link>
			<description><![CDATA[&gt; Не надо давать способ выбрать объект 20 способами. Надо дать один. Причем очевидный. <br/>
<br/>
Ну один самый очевидный способ и так все знают — чистый SQL, всё что далее — оптимизация способов его генерации, и тут уж не так много методов, чтобы их запомнить. Штук 5 всего, а ключевых так вообще 2-3.<br/>
<br/>
&gt; PDO, в отличие от mysql_ позволяет нормально вставлять константные значения в запросы. А вы ваше экранирование где-нибудь обязательно забудете и получите дыру в безопасности.<br/>
<br/>
Ну и DaBase нормально с константами работает, в руководстве ведь написано. И какая разница, что вы забудете в PDO значение переменной без prepare вставить, или в DaBase так же? Если человек дурак…<br/>
<br/>
&gt; То, что добавить поддержку других баз невозможно принципиально — дикий фейл. Вы вообще про полиморфизм слышали что-нибудь?<br/>
<br/>
Слышал, только пока необходимости не было, не думал, что для большинства этот вопрос так остро стоит. На днях прикручу PDO с его драйверами под прочие БД и зарефакторю генерацию соответствующего SQL.<br/>
<br/>
&gt; Освоить тот же Propel туда как проще чем вашу ORM. Документация в разы лучше и сам код логичнее. У меня на это ушло ну максимум час.<br/>
<br/>
Спорный вопрос. Properl & Doctrine & etc это полноценные и тяжелые ORM, они требуют полной спецификации базы и соответствующей конкретики в обращении с ней. Вы высоко нагруженные проекты на Propel когда-нибудь профайлили? Случается, что в конечном счёте приходится или Propel откручивать, или вторую серверную стойку на Xeon-ах прикручивать.<br/>
<br/>
&gt; Вы предложили что-то революционное? Удачно совместили плюсы других ORM и не повторили минусов?<br/>
<br/>
Я предложил альтернативу, и ни в коем случае не конкуренцию тяжеловесным ORM пакетам. Главная задача серьёзных ORM пакетов — универсальность, за что приходится платить производительностью и удобством использования. Я преследовал главный принцип практичности, т.к. именно этого мне часто и не хватает в других библиотеках. А вдруг не я один такой?<br/>
<br/>
&gt; Что-то удобнее существующего? <br/>
<br/>
Удобнее? Я считаю да, во многих моментах удобнее. Надо будет в топике подправить, что сие не есть Enterprise-решение.<br/>
<br/>
&gt; Удачно совместили плюсы других ORM и не повторили минусов?<br/>
<br/>
А это вообще возможно? Простите, но как вы себе представляете пылесос и фен в одном флаконе?<br/>
<br/>
&gt; Единственный «аргумент» — легкость, который отнюдь не является плюсом и являться им не может.<br/>
<br/>
Скажите это тем, кто использует Twitter вместо Livejournal. Вы слишком критичны. Я не спорю, что есть широкий ряд задач, для которых актуальнее использовать Properl или Doctrine, но всё-таки считаю, что спектр адекватного применения DaBase также достаточно широк.]]></description>
			<pubDate>Sun, 18 Oct 2009 21:08:19 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 20:28:22 remal</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087344</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087344</link>
			<description><![CDATA[Читал я документацию. Каша. Не надо давать способ выбрать объект 20 способами. Надо дать один. Причем очевидный. То, что добавить поддержку других баз невозможно принципиально — дикий фейл. Вы вообще про полиморфизм слышали что-нибудь?<br/>
<br/>
PDO, в отличие от mysql_ позволяет нормально вставлять константные значения в запросы. А вы ваше экранирование где-нибудь обязательно забудете и получите дыру в безопасности. Да и кроме этого плюсы есть, которые очевидны если почитать документацию.<br/>
<br/>
Я не понимаю почему надо использовать велосипед сомнительного качества с крайне низким кол-вом функциональности ради «легкости». Освоить тот же Propel туда как проще чем вашу ORM. Документация в разы лучше и сам код логичнее. У меня на это ушло ну максимум час.<br/>
<br/>
Вы предложили что-то революционное? Что-то удобнее существующего? Удачно совместили плюсы других ORM и не повторили минусов? Ответы на все вопросы: нет. Единственный «аргумент» — легкость, который отнюдь не является плюсом и являться им не может. Ибо не кол-вом кода мерится качество и удобство продукта.]]></description>
			<pubDate>Sun, 18 Oct 2009 20:28:22 GMT</pubDate>
			<author>remal</author>
		</item>
	

	
		<item>
			<title>18.10.2009 20:11:07 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087312</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087312</link>
			<description><![CDATA[) смешно<br/>
<br/>
Знаю я про Propel, а Doctrine так лучше бы и не знал вовсе. Ещё раз: DaBase — это не ORM в буквальном смысле. Вы документацию вообще видели, на страницу проекта хотя бы заходили, читали что там написано?<br/>
<br/>
И про PDO я тоже знаю, но бонусы его пока не актуальны были. Единственное в чём он действительно может быть полезен так это как адаптер к другим БД, как-нибудь прикручу на досуге.<br/>
<br/>
А вы не понимаете, что для ряда проектов Doctrine и Propel просто неприлично тяжелы и большинство просто не возьмётся их осваивать? Хотя я вот освоил, но всё равно порой не актуально мне на тракторе ковёр пылесосить. Вот для таких целей и использую DaBase — просто зная структуру базы работаю с ней как с объектной моделью, а где критично добавляю спецификацию моделей с набором правил валидации.<br/>
<br/>
]]></description>
			<pubDate>Sun, 18 Oct 2009 20:11:07 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 19:46:28 remal</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087249</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087249</link>
			<description><![CDATA[Автор, узнайте, наконец, про <a href="http://ru.php.net/manual/en/book.pdo.php">PDO</a>!<br/>
<br/>
Я не верю, что после просмотра кода Propel'a или Doctrine можно написать такое. Неужели вы не смотрели другие ORM перед тем как писать свою?]]></description>
			<pubDate>Sun, 18 Oct 2009 19:46:28 GMT</pubDate>
			<author>remal</author>
		</item>
	

	
		<item>
			<title>18.10.2009 19:37:57 capt_Rimmer</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087223</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087223</link>
			<description><![CDATA[Нас минусуют, а мы кодим :) Народ, есть критика к коду — джойнимся к проекту и делаем изменения. Есть критика по доке — джойнимся и делаем доку. Или вы хотите бесплатно, своё, узконаправленное, но безупречно описанное?)… и манную кашу с неба вёдрами :)]]></description>
			<pubDate>Sun, 18 Oct 2009 19:37:57 GMT</pubDate>
			<author>capt_Rimmer</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:45:52 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087081</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087081</link>
			<description><![CDATA[Отложенной загрузки нету, вот сколько работаю острой необходимости в ней как-то не возникало.<br/>
<br/>
Насчёт двух объектов одной и той же строки: момент с одной стороны важный, но с другой стороны не совсем т.к. у вас ведь если подумать в один момент времени один и тот же объект может быть задействован в разных скриптах… а это уж точно почти никак не проконтролировать. <br/>
<br/>
Но меня в микро-тасках есть этот вопрос, хочу унаследовать решение у LightOrm for PHP.]]></description>
			<pubDate>Sun, 18 Oct 2009 18:45:52 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:38:38 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087061</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087061</link>
			<description><![CDATA[В этом плане нет, не получится. Хотя я вот сейчас всё больше убеждаюсь, что на самом деле объекты должны выступать в качестве factory для геттеров, тогда можно было бы просто для $db-&gt;usersGold выдавать Getter у которого уже проставлено $getter-&gt;isGold(true);<br/>
<br/>
Но просто в этом случае теряется некая прозрачность логики работы объектов. Я вовсе не считаю правильным возлагать на инструмент абстрагирования с базой функции контроля бизнес процессов, потому как в этом случае всем прочим разработчикам придётся каждый раз обращаясь к методам библиотеки учитывать что они могли бы быть 15 раз переопределны.<br/>
<br/>
В вашем случае мне кажется проще всего было бы ограничиться одной моделью User, при этом добавив в своё API метод возвращаемый Getter с фильтром по isGold. Т.е.:<br/>
<br/>
public function getGoldUsersGetter() {<br/>
 return $this-&gt;db-&gt;users-&gt;isGold(true);<br/>
}<br/>
<br/>
B потом уже делайте с ним что хотите.]]></description>
			<pubDate>Sun, 18 Oct 2009 18:38:38 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:36:53 haskel</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087057</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087057</link>
			<description><![CDATA[Конструктивная критика:<br/>
C DaBase все ясно, но почему <a href="http://www.timeout.ru/pix/95887.jpeg" title="Белая Стрекоза Любви">Николай Воронов</a>?]]></description>
			<pubDate>Sun, 18 Oct 2009 18:36:53 GMT</pubDate>
			<author>haskel</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:31:47 ArtemS</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087050</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087050</link>
			<description><![CDATA[Не увидел и не нашел в документации отложенной загрузки.<br/>
$comment-&gt;getUser()-&gt;getName() — Так можно?<br/>
<br/>
И еще. ОРМ никак не запоминает объекты, поэтому в определенный момент времени у меня может быть 2 объекта в памяти, которые будут ссылаться на одну и туже запись в таблице, а это очень плохо.<br/>
<br/>
]]></description>
			<pubDate>Sun, 18 Oct 2009 18:31:47 GMT</pubDate>
			<author>ArtemS</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:26:49 aubt</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087041</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087041</link>
			<description><![CDATA[я имел ввиду выборку.<br/>
<br/>
$db-&gt;usersGold-&gt;limit(10)-&gt;get() == select * from users where isGold = 1 limit 10<br/>
<br/>
или нет?]]></description>
			<pubDate>Sun, 18 Oct 2009 18:26:49 GMT</pubDate>
			<author>aubt</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:23:28 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087036</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087036</link>
			<description><![CDATA[Да мне то чего минусовать, сам в минусе :)<br/>
<br/>
Пробежался по документации этого RedBean <a href="http://www.redbeanphp.com/#/beans">http://www.redbeanphp.com/#/beans</a>. Не знаю чем он лучше всех прочих ORM, хотя кстати всем прочим я предпочитаю DaBase (хоть она и не совсем и ORM). Не аргумент?<br/>
<br/>
Тогда вот, пробежался по исходникам… помимо претензий к архитектуре, вот конкретный пример:<br/>
<br/>
<code> public function selectRecord($type, $ids) {<br/>
 $type=$this-&gt;adapter-&gt;escape($type);<br/>
 $rows = $this-&gt;adapter-&gt;get( &quot;SELECT * FROM `$type` WHERE id IN ( &quot;.implode(&quot;,&quot;,$ids).&quot; )&quot;);<br/>
 if ($rows && is_array($rows) && count($rows)&gt;0) {<br/>
 return $rows;<br/>
 }<br/>
 else {<br/>
 return null;<br/>
 }<br/>
 }<br/>
</code><br/>
<br/>
А где элементарное экранирование? Не стал бы я таким разработчикам свою базу доверять.]]></description>
			<pubDate>Sun, 18 Oct 2009 18:23:28 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:14:43 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087015</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087015</link>
			<description><![CDATA[Пока только `id`, но в планах зарефакторить на кастомные варинаты. Поймите меня правильно, на разрботку этой библиотеки, в том числе на написание документации ушло всего 4 дня.<br/>
<br/>
На на самом деле зарефакторить на поддержку кастомных PK-полей дело плёвое, просто в константу вынести название PK-поля. Дальше начинаются вариации с составными PK-полями, но их уже как-то совсем избыточно учитывать. ]]></description>
			<pubDate>Sun, 18 Oct 2009 18:14:43 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:13:11 nayjest</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087012</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087012</link>
			<description><![CDATA[Нет, ну действительно чем? RedBean — такой же недо-Orm, только намного лаконичней и архитектурно продуманней (я не говорю сейчас о классических ORM системах типа Doctrine и Propel, заминусовали видимо потому что увидели первый раз «какую-то малоизвестную библиотеку»). Чем ваш лучше?]]></description>
			<pubDate>Sun, 18 Oct 2009 18:13:11 GMT</pubDate>
			<author>nayjest</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:08:39 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2087000</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2087000</link>
			<description><![CDATA[поправка:<br/>
<br/>
$validator-&gt;add('isGold', new Validator_Rule_Regexp('/^1$/'))]]></description>
			<pubDate>Sun, 18 Oct 2009 18:08:39 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:08:05 ArtemS</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086998</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086998</link>
			<description><![CDATA[Всегда в таблице primary key должен называться id, или можно назвать user_id?]]></description>
			<pubDate>Sun, 18 Oct 2009 18:08:05 GMT</pubDate>
			<author>ArtemS</author>
		</item>
	

	
		<item>
			<title>18.10.2009 18:07:29 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086996</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086996</link>
			<description><![CDATA[ну конечно, объявить для класса GoldUser<br/>
<br/>
public $isGold = 1;<br/>
<br/>
и для верности можно ещё валидацию на него повесить, типа<br/>
<br/>
$validator-&gt;add(new Validator_Rule_Regexp('/^1$/'))<br/>
<br/>
оно по умолчанию будет автоматом при всех insert-ах и update-ах срабатывать]]></description>
			<pubDate>Sun, 18 Oct 2009 18:07:29 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 17:44:50 aubt</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086940</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086940</link>
			<description><![CDATA[Допустим в таблице users есть поле isGold.<br/>
Можно ли сделать так, чтобы $db-&gt;usersGold выдавал только объекты с isGold = 1?]]></description>
			<pubDate>Sun, 18 Oct 2009 17:44:50 GMT</pubDate>
			<author>aubt</author>
		</item>
	

	
		<item>
			<title>18.10.2009 17:39:09 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086925</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086925</link>
			<description><![CDATA[Ну и в чём проблема?<br/>
На DaBase это просто делается<br/>
<br/>
наследуем User от DaBase_Object и прописываем const table = 'users'<br/>
<br/>
наследуем GoldUser от User и… и всё<br/>
<br/>
$db-&gt;users и $db-&gt;usersGold будут выдавать объекты одной таблицы, но разных классов]]></description>
			<pubDate>Sun, 18 Oct 2009 17:39:09 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 17:36:31 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086920</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086920</link>
			<description><![CDATA[С Hibernate я как раз знаком, но писать что-то похожее не захотелось, равно как не захотелось использовать его на практике(есть пара неполноценных адаптеров под PHP). Тяжёлый он, хотя конечно очень функциональный.<br/>
<br/>
Грубо так сравнивать, Hibernate больше подходит для Enterprise-решений, и при том если с нуля только на нём и разрабатывать. А попробуйте действующий проект на Hibernate зарефакторить, непросто это очень.]]></description>
			<pubDate>Sun, 18 Oct 2009 17:36:31 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 16:54:53 nikelin</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086836</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086836</link>
			<description><![CDATA[Наследования модели A от модели B.<br/>
<br/>
$db-&gt;user-&gt;…<br/>
<br/>
$db-&gt;user_gold-&gt;…<br/>
<br/>
Мне, допустим, нужно чтобы user и user_gold — были одной и той же таблицой.]]></description>
			<pubDate>Sun, 18 Oct 2009 16:54:53 GMT</pubDate>
			<author>nikelin</author>
		</item>
	

	
		<item>
			<title>18.10.2009 16:51:17 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086827</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086827</link>
			<description><![CDATA[1. В каком-то смысле согласен, но там есть некоторые вилки. Буду думать как их разрешить.<br/>
<br/>
2. Я знаю, что такое фабрика объектов, но так или иначе невозможно избежать создания отдельного объекта DaBase_Getter на каждый отдельный запрос. Надо понимать, что это объект, который хранит конфигурацию запроса: фильтры, сортировки, join-ы. <br/>
<br/>
Что же теперь, сделать один глобальный Getter и в нём стеком хранить все текущие конфигурации запросов? Там по накладкам памяти ещё больше уйдёт.<br/>
<br/>
P.S. В сторону наследования чего от чего? Там всего 3 базовых класса. Может имеется ввиду создание абстрактных прородителей?]]></description>
			<pubDate>Sun, 18 Oct 2009 16:51:17 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 16:42:19 nikelin</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086817</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086817</link>
			<description><![CDATA[1. Это очень плохо, потому что это не нужно, ибо сам объект User нигде явно не используется.<br/>
<br/>
2. Зачем это допускать, если этого можно избежать? См. Фабрика объектов.<br/>
<br/>
P.S Ещё подумайте в сторону наследования. ]]></description>
			<pubDate>Sun, 18 Oct 2009 16:42:19 GMT</pubDate>
			<author>nikelin</author>
		</item>
	

	
		<item>
			<title>18.10.2009 16:35:12 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086805</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086805</link>
			<description><![CDATA[1. В данному случае от этого никак не уйти, и в конце концов ничего архи-плохого в этом не вижу.<br/>
<br/>
2. Для памяти это ерунда т.к. сам по себе DaBase_Getter почти ничего не весит, к тому же по одному крохотному объекту на выборку это тем более ни о чём по сравнению с 10-20 объектами на выборку у тех же Propel/Doctrine/etc. <br/>
<br/>
Вообще странная претензия т.к. сам результат из 100 объектов выборки будет по сути в 100 раз тяжелее объекта запроса выборки, но и всё равно при этом очень мало памяти задействуется.<br/>
<br/>
3. Адаптер для подключения будет, и вполне возможно что на базе PDO<br/>
<br/>
4. Про блокировки пока не думал даже, но буду учитывать. Пока обходимся транзакциями и блокировками на уровне mysql.]]></description>
			<pubDate>Sun, 18 Oct 2009 16:35:12 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
		<item>
			<title>18.10.2009 16:24:02 nikelin</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086774</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086774</link>
			<description><![CDATA[Я уже написал об основных:<br/>
1. Явно ненужное Dependency Injection ввиде DataBase_Object<br/>
2. Создание DataBase_Getter'а каждый раз, когда идёт обращение к DataBase_Db::getGetter(), что конечно же очень «оптимально» для памяти.<br/>
3. Отсутствие адаптера для подключения.<br/>
4. Отсутствие программной поддержки блокировок ( см. «Пессимистическая блокировка», «Оптимистическая блокировка»), т.е. оно есть но я никак не смогу узнать заблокирована ли таблица в настоящий момент, и т.д.<br/>
]]></description>
			<pubDate>Sun, 18 Oct 2009 16:24:02 GMT</pubDate>
			<author>nikelin</author>
		</item>
	

	
		<item>
			<title>18.10.2009 16:12:54 liaren</title>
			<guid isPermaLink="true">http://habrahabr.ru/blogs/php/72731/#comment_2086748</guid>
			<link>http://habrahabr.ru/blogs/php/72731/#comment_2086748</link>
			<description><![CDATA[Помимо отсутствия адаптера подключения к БД, в чём ещё ошибки проектирования?]]></description>
			<pubDate>Sun, 18 Oct 2009 16:12:54 GMT</pubDate>
			<author>liaren</author>
		</item>
	

	
</channel>
</rss>

