А нуу если так, то тут у нас разные взгляды))Всего лишь однострочность. Остальное уже стилистические мелочи.
А нуу если так, то тут у нас разные взгляды))Всего лишь однострочность. Остальное уже стилистические мелочи.
ахаха, какой наивный юноша. Написание (new Foo)-> ничем не лучше Foo::.вызорва метода объекта в стиле (new app_db())->, а не костылем в виде вызова статического метода класса, с передачей области видимости объекта методу, который вообще не должен ничего знать об этом объекте?
Это синтаксический сахар, учет которого делается таким же сахаром в QB, вопрос давно решен.Ваш параметр не учитывает SQL_CALC_FOUND_ROWS для MySQL. наверное в вашем qb это учтено?
не проблема совершенно, в этом sql ничего сложногоСделайте такой мне SQL через билдер (поиск маршрута движения от остановки "с" до остановки "д" по маршруту от точки "а" до точки "б").
сделалифильтр типа "и" для каталога по разным параметрам с возможностью выбора нескольких возможных значений для одного параметра , explain про индексы ниже
FROM products INNER JOIN products_x_categories INNER JOIN categories
WHERE products.status = 'in_store' AND products.quantity >0 AND categories.status = 'active' AND categories.visibility =1
В скорости.Типичные селекты по одному параметру конечно можно дергать, но представим в чем его преимущество перед SQL запросом, написанном в строчке?
$post = Posts::model()->cache()->findByPk($post);
echo $post->author->name;
//ручками пишем кеширование
$q = "select * from posts where posts.(какое поле тут ключ? надо глянуть структуру) =:post limit 1";
$p = $DB->query(['post'=>$post]);
$q = "select * from users where users.(какое поле тут ключ? надо глянуть структуру) =:user limit 1";
$DB->query(['user'=>$p['по какому полю идет связь? надо глянуть структуру!']]);
о, да, расскажи что еще я делал невозможногоНи один ОРМ не "построит (build)" подобный SQL, который из 500K товаров и 6M параметров с доп выборками по нескольким категориям, учитывая не только вариации фильтра, но и признак общедоступности, который вытянет 2 строки за 0.01 сек
как-бы да, этот код становится читабельнымwhere ".($onlyPublic ? "`app_catalog_item`.`public` = '1' and (" : null)." `categoryId` IN ('".implode("', '", $array)."') ".($onlyPublic ? ")" : null)."
Для этого и нужен орм.
с какого это ничуть ни лучше?)) В первом случае создается объект, во втором выполняется статичный метод с передачей области видимости, разницу вы должны знать и понимать.ахаха, какой наивный юноша. Написание (new Foo)-> ничем не лучше Foo::.
Вот именно в этом. Если вы используете библиотеку - то должны ее использовать так, как она есть, и если ее возможности не отвечают вашим потребностям, то по норме - вы вкладываете в эту библиотеку код и выпускается новая версия, или вы отказываетесь от ее использования.о, да, расскажи что еще я делал невозможного
не хочу сказать, что это было очень просто, да, патч на USE KEY мы писали,
и в итоге просто переписали ActiveRecord.
//
какое поле тут ключ? надо глянуть структуру
"
select
*
from
`root_bricks`
left join
`root_info` on `root_bricks`.`root_id` = `root_info`.`id`
left join
`schedule` on `root_bricks`.`root_id` = `schedule`.`root_id`
right join
`carriers` on `carriers`.`id` = `root_bricks`.`carrier_id`
right join
`root_nodes` as `begin_node` on `root_bricks`.`root_id` = `begin_node`.`root_id` && `root_bricks`.`begin_point` = `begin_node`.`begin_point` -- @todo убрать из sql в будущем, разобравшись в коде
right join
`root_nodes` as `end_node` on `root_bricks`.`root_id` = `end_node`.`root_id` && `root_bricks`.`end_point` = `end_node`.`end_point`
where
`schedule`.`dispatch_date` = '".$datetime->format("Y-m-d")."'
and `root_bricks`.`cost` > 0
and `root_bricks`.`begin_point` = '".$db->escape($dispatchStation)."'
and `root_bricks`.`end_point` = '".$db->escape($arrivalStation)."'
and `begin_node`.`order` <= `end_node`.`order`
order by
`schedule`.`dispatch_datetime`
"
// при наличии qb он бы писался в стиле
$bricks
->withInfo()
->withSchedule()
->withCarriers()
->withNodeBegin()
->withNodeEnd()
->whereDispatch(new DateTime())
->whereHasCost()
->whereBricksBetween(..., ...)
->orderBy('dispatch_datetime');
А ты подумай.с какого это ничуть ни лучше?)) В первом случае создается объект, во втором выполняется статичный метод с передачей области видимости, разницу вы должны знать и понимать.
Вопрос, сколько времени нужно потратить, что бы настроить qb правильно делать этот запрос, при том, что он будет использован лишь раз?Вот, кстати, ещё один плюс qb и orm, привыкаешь не писать write only код. к сожалению, мне приходилось поддерживать такой код http://phpclub.ru/talk/threads/query-builder-vs-конкатенация-запроса-ручками.78381/page-2#post-707218 это ад, его прочесть невозможно, не говоря уже о модификации и тестировании.
При наличии qb, все джойны и условия вынеслись бы в методы с говорящими названиями, которые можно читать без километра переписки и поисков по внутренней вики.
PHP:" // при наличии qb он бы писался в стиле $bricks ->withInfo() ->withSchedule() ->withCarriers() ->withNodeBegin() ->withNodeEnd() ->whereDispatch(new DateTime()) ->whereHasCost() ->whereBricksBetween(..., ...) ->orderBy('dispatch_datetime');
Потому что классо-ориентированное программирование и объектно-ориентированное программирование - разные вещи))А ты подумай.![]()
$db = db::query($sql, $data);
$db = (new app_db())->query($sql, $data);
$affected_rows = (new app_db())->use_rw_connection()->query("insert into")->affected_rows();
$rows = (new app_db())->use_ro_connection()->switch("Europe/Moscow")->query("select ...")->fetch_all();
Нет, смотри внимательно. Мой коммент был к$affected_rows = app_db::rw_connection()->query("insert into")->affected_rows();PHP:class app_db { public static function __callStatic($method, array $args) { return call_user_func_array([new static, $method], $args); } }
то же самое. Начинаешь понимать?![]()
$db = db::query($sql, $data);
Например, как фасады в Laravel. А с твоим (new app_db)-> как?Еще раз, уточняю обсуждаемый кусок:
Как мы тут можем заюзать "class MyDb extends app_db" ?PHP:$db = db::query($sql, $data);
Пост мой последний видел же? Т.е. вот так: http://pastebin.com/UEUxX31PНапример, как фасады в Laravel. А с твоим (new app_db)-> как?
Ты вкладываешь в понятие «передача области видимости» что-то своё. Передача области видимости была бы, если бы в статическом методе мы бы могли свободно использовать переменные из контекста вызова. Вот это «передача области видимости».В первом случае создается объект, во втором выполняется статичный метод с передачей области видимости, разницу вы должны знать и понимать.
Ахахахаха.... Где вы нашли синглтон??? Я вам про адаптер, вы мне про синглтон)) Вы везде видите синглтон?))) А писать в стиле "fluent interface", да, мне это нравится, удобно.Ты вкладываешь в понятие «передача области видимости» что-то своё. Передача области видимости была бы, если бы в статическом методе мы бы могли свободно использовать переменные из контекста вызова. Вот это «передача области видимости».
Твой код с (new Foo)-> яйца выеденного не стоит без DI. Обычный singleton. А писать (new Foo) или Foo::getInstance() или даже Foo::bar() — это тут уже не столь принципиально. Я вижу ты любишь fluent interface, но архитектурно тут 0 отличий.
Практически каждый метод реиспользуемый и при наличии qb пишется чуть дольше твоей простыни, а если есть условия, то выигрыш будет изначально. Получаем удобный и читаемый код, который легко поддерживать без всякой документации.Вопрос, сколько времени нужно потратить, что бы настроить qb правильно делать этот запрос, при том, что он будет использован лишь раз?
Где вы нашли синглтон?
protected static $_mysqli;
// ...
if (!isset(self::$_mysqli))
{
// ...
self::$_mysqli=new mysqli(
db::setAdapter(new app_db_mysqli());