Query Builder vs конкатенация запроса ручками

На какой стороне ты?

  • QB / ORM / etc

    Голосов: 18 78,3%
  • Пилю все ручками, не обламываюсь.

    Голосов: 5 21,7%
  • ЭОС

    Голосов: 0 0,0%

  • Всего проголосовало
    23

Активист

Активист
Команда форума
PHP:
protected static $_mysqli;
// ...
    if (!isset(self::$_mysqli))
    {
// ...
      self::$_mysqli=new mysqli(
Фанат с таким же успехом может написать
PHP:
db::setAdapter(new app_db_mysqli());
И таки да, твой код — это синглтон головного мозга, просто ты не в состоянии этого понять. У тебя всё держится на static'ах и глобальном состоянии. Сколько говнецо не прикрывай, а лучше от (new Foo) код не станет.

По поводу области видимости — это вообще клиника, почитай там Википедию, разберись с этим понятием. Куда там и что у тебя передаётся.
Я все в состоянии понять. Вы увидели статичное свойство и у вас сразу в голове появилось "синглтон", больше ничего не знаю, но наличие кардинального отличия одного от другого вы понять не можете. В моем случае осущевтляется еденственное соедиение к БД.

Если бы Фанат написал "db::setAdapter(new app_db_mysqli());" - то это регистрация объекта (registry), для централизованного доступа к объекту. Хотя нет, для вас это опять синглтон?))
 

Вурдалак

Продвинутый новичок
Активист, это всё buzzwords, ты не видишь сути. Нет различий между (new Foo) и Foo::, nuff said.

Подумай, а в состоянии ли ты переписать код без единого static (допустимо для методов, но не для переменных), глобальных констант и переменных. Ну, хотя бы в теории.
 

Активист

Активист
Команда форума
PHP:
protected static $_mysqli;
// ...
    if (!isset(self::$_mysqli))
    {
// ...
      self::$_mysqli=new mysqli(
Фанат с таким же успехом может написать
PHP:
db::setAdapter(new app_db_mysqli());
И таки да, твой код — это синглтон головного мозга, просто ты не в состоянии этого понять. У тебя всё держится на static'ах и глобальном состоянии. Сколько говнецо не прикрывай, а лучше от (new Foo) код не станет.

По поводу области видимости — это вообще клиника, почитай там Википедию, разберись с этим понятием. Куда там и что у тебя передаётся.
Тоже синглтон?)) http://pastebin.com/DYgjyn1u
 

Вурдалак

Продвинутый новичок

Активист

Активист
Команда форума
«Singleton-like crap». Так я бы тебя и не взял, ты чё.
Ахаха... Да да, синглтон бл..))

Из определения
Одиночка (англ.Singleton) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.

Если вы считаете что вышеуказанные листинги гарантирует единственный экземляр класса с глобальной точкой доступа, то с матаном у вас была проблема, имхо.
 

Вурдалак

Продвинутый новичок
Активист, да чувак, это детский сад, ты пытаешься докопаться до buzzwords. Называй это multiton'ом, как угодно, это всё имеет абсолютно те же проблемы, что и любая singleton-like сущность.

Ты успешно игнорируешь и мои реплики о DI, и о том, что ты не в состоянии мыслить без глобальных сущностей: констант и static-переменных.
 

Активист

Активист
Команда форума
Активист, да чувак, это детский сад, ты пытаешься докопаться до buzzwords. Называй это multiton'ом, как угодно, это всё имеет абсолютно те же проблемы, что и любая singleton-like сущность.

Ты успешно игнорируешь и мои реплики о DI, и о том, что ты не в состоянии мыслить без глобальных сущностей: констант и static-переменных.
Где вы нашли singlton-like сущность? О каком DI вы говорите, если ни от каких внешних зависимостей объект не зависит. Хотя нет, давайте вставим туда внешнюю зависимость, сохраним ее в registry, или вообще начнем ее таскать с момента инициализации, но будем ее передавать.

Это проблема адаптера, а не приложения, и если приложению нужно что-то другое - то он сообщает об этом адаптеру (через тот же сеттер), который в свою очередь решает, что ему делать и делать ли. Нет, вы же пытаетесь на приложение передать функции хранение и передачу состояния соединения адаптера СУБД. Это соизмеримо делегированием полномочий контроля аппаратных частей устройств PC c драйверов этих устройств на конечное приложение.
 

WMix

герр M:)ller
Партнер клуба
PHP:
if (!isset($this->_db)){
$class  = "app_db_".APP_SQL_SERVER;
$this->_db = new $class;
 }
return $this->_db;
// ...
self::$_mysqli = new mysqli(
    APP_MYSQLI_HOST,
    APP_MYSQLI_USER,
    APP_MYSQLI_PASS,
    APP_MYSQLI_DB
);
как говоришь 2ю базу подключить? класс app_db_mysqli захаркордин на уровне константы, как и данные подключения
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Если вы используете библиотеку - то должны ее использовать так, как она есть
утверждение полностью противоречит идеологии open source

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

мне достаточно знать особенности SQL того или иного SQL сервера, и я могу четко и сразу изменить сам запрос,
В огороде бузина, а в городе - дядька.
Итак, в команде 5-10 человек: один DBA, один лид, и кодеры, которые пилят.
DBA занимается базой, лид помогает тюнить запросы, остальные не лезут.
Ты и админку пишешь, и базу тюнишь? Я за разделение - админку может пилить кодер с зарплатой 40.

а если это обернуто в какую либо библиотеку, то мне придется изучить ее документацию, а если там внесены недокументированные изменения - то это заставит меня еще и разобраться с этой библиотекой.
я глубоко знаю фреймворк, на котором работаю. я его выбирал.

Выигрываете ли вы на скорости кодинга (именно кодинга), можно еще поспорить. А смотреть в структуру БД нужно, что бы хотя бы знать есть ли индексы , и используются ли они при выборках.
да, особенно кодеры - они очень сильно выигрывают, только DBA знает структуру базы, там >100 таблиц,
а запросы почти все стандартные, индексы давно созданы, проверять их каждый раз не надо.

А по поводу затыков SQL_CALC_FOUND_ROWS - обновить MySQL Engine ))
Ситуация такая: у нас фильтр и пангинация по таблице, например, users. Для получения данных делаем join нескольких других крупных таблиц - address, profile.
При SQL_CALC_FOUND_ROWS делается join по всем записям всех таблиц в запросе. Если его убрать - будет join только по limit, а количество можно посчитать по одной таблице запросом select count(*) from users, который отрабатывает без full scan.
 

Активист

Активист
Команда форума
PHP:
if (!isset($this->_db)){
$class  = "app_db_".APP_SQL_SERVER;
$this->_db = new $class;
}
return $this->_db;
// ...
self::$_mysqli = new mysqli(
    APP_MYSQLI_HOST,
    APP_MYSQLI_USER,
    APP_MYSQLI_PASS,
    APP_MYSQLI_DB
);
как говоришь 2ю базу подключить? класс app_db_mysqli захаркордин на уровне константы, как и данные подключения
Показал уже: http://pastebin.com/DYgjyn1u , (было выше). Нужно мыслить не на уровне того, используется ли константа сейчас, а на уровне того, насколько объекты быстро могут быть дополнены с сохранением обратной совместимости и минимальными трудозатратами. Понадобиться исключительно новое соединение, то вполне быстро можно внести изменения, как указанные выше, так и просто поменяв метод коннекта и геттера объекта.
PHP:
<?php
   /**
    * MySQLi object
    * @var mysqli
    */
    protected static $_default_mysqli;

    /**
    *
    * @var mysqli
    */
    protected $_current_mysqli;

   /**
    * (non-PHPdoc)
    * @see app_db_interface::connect()
    */
   
public function connect($host = null, $user = null, $password = null, $db = null, $set_as_default_connection = true)
    {
        mysqli_report(MYSQLI_REPORT_ALL & ~MYSQLI_REPORT_INDEX);
       
        if (!isset($host))
        {
            if (isset(self::$_default_mysqli))
            {
                $this->_current_mysqli = self::$_default_mysqli;
               
                return $this;
            }
           
            $host = APP_MYSQLI_HOST;
            $user = APP_MYSQLI_USER;
            $password = APP_MYSQLI_PASS;
            $db = APP_MYSQLI_DB;
        }
       
       
        try {
           
            $this->_current_mysqli = new mysqli(
                $host,
                $user,
                $password,
                $db
            );
               
            $this->_current_mysqli->set_charset(APP_DEFAULT_SQL_CHARSET);
               
            if (defined("APP_DEVELOPMENT_VERSION") && APP_DEVELOPMENT_VERSION)
            {
               
                $this->_current_mysqli->query("set profiling = 1;");
                $this->_current_mysqli->query("set @@profiling_history_size = 100;");
            }
        }
        catch(mysqli_sql_exception $e)
        {
            throw new app_exception($e->getMessage(), 503);
        }
       
        if ($default_connection)
        {
            self::$_default_mysqli = $this->_current_mysqli; 
        }
           
        return $this;
    }
//...
   /**
    * Возвращает объект MySQLi
    * @return mysqli
    */
    protected function _mysqli()
    {
        if (!isset($this->_current_mysqli))
        {
            $this->connect();
        }
      
        return $this->_current_mysqli;
    }
 

Активист

Активист
Команда форума
утверждение полностью противоречит идеологии open source
или мы делаем форк, сохранив API и описав дополнительные фичи
В огороде бузина, а в городе - дядька.
Итак, в команде 5-10 человек: один DBA, один лид, и кодеры, которые пилят.
DBA занимается базой, лид помогает тюнить запросы, остальные не лезут.
Ты и админку пишешь, и базу тюнишь? Я за разделение - админку может пилить кодер с зарплатой 40.
я глубоко знаю фреймворк, на котором работаю. я его выбирал.
да, особенно кодеры - они очень сильно выигрывают, только DBA знает структуру базы, там >100 таблиц,
а запросы почти все стандартные, индексы давно созданы, проверять их каждый раз не надо.
Ситуация такая: у нас фильтр и пангинация по таблице, например, users. Для получения данных делаем join нескольких других крупных таблиц - address, profile.
При SQL_CALC_FOUND_ROWS делается join по всем записям всех таблиц в запросе. Если его убрать - будет join только по limit, а количество можно посчитать по одной таблице запросом select count(*) from users, который отрабатывает без full scan.
Согласен, справедливо для одного проекта, который является единственным в разработке и коммерческим. Но если бы проект был общедоступным, и использовалась та или иная либа, то нужно сначала вложить в эту либу, а потом ее юзать, поскольку либа идет отдельно от проекта. Скажем для внедрения новых возможностей в gnome нужно профиксить gtk. Сначала реквист на дополнение gtk или вклад, потом уже допиливание gnome.
 

WMix

герр M:)ller
Партнер клуба
PHP:
(new app_db())->connect( $host, ... )->query($sql, $data);
правильно мыслю?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Согласен, справедливо для одного проекта, который является единственным в разработке и коммерческим. Но если бы проект был общедоступным, и использовалась та или иная либа, то нужно сначала вложить в эту либу, а потом ее юзать, поскольку либа идет отдельно от проекта. Скажем для внедрения новых возможностей в gnome нужно профиксить gtk. Сначала реквист на дополнение gtk или вклад, потом уже допиливание gnome.
пока libevent не поправили, anight спокойно прикладывал в исходники fpm патченый libevent, никто не возражал :)
но да, работа с открытыми проектами сильно отличается от коммерческого,
просто ты привел пример из моей жизни - каталог магазина
 

флоппик

promotor fidei
Команда форума
Партнер клуба
В общем, с ОРМ-ом ощущения не натуральные от запросов ;)
 

AmdY

Пью пиво
Команда форума
Согласен, справедливо для одного проекта, который является единственным в разработке и коммерческим. Но если бы проект был общедоступным, и использовалась та или иная либа, то нужно сначала вложить в эту либу, а потом ее юзать, поскольку либа идет отдельно от проекта. Скажем для внедрения новых возможностей в gnome нужно профиксить gtk. Сначала реквист на дополнение gtk или вклад, потом уже допиливание gnome.
а в случае со своим велосипедом в него надо вложиться в тысячу раз больше. обычно там есть всё что нужно, чуть что, всегда можно форкнуть. в тех же линукс дистрибутивах в каждом своя версия гнома со своими патчами. в этом и есть идея, в либе реализовано 99% потребностей, а остальные 1 можно решить форком, чтобы не перегружать основной функционал.

У тебя в коде куча хардкода и констант, рантайм ничего поменять нельзя, а для правок нужно править основной класс. sql запросы длиной в километр и работать с ними можешь наверное только ты, новый член команды будет месяц въезжать и ломать обратную совместимость, т.к. код даже тестами не обложишь. и при этом ты берешься проповедовать свой подход и наезжаешь на пример фаната, не как работают фасады споришь с фиксером?
 

Активист

Активист
Команда форума
а в случае со своим велосипедом в него надо вложиться в тысячу раз больше. обычно там есть всё что нужно, чуть что, всегда можно форкнуть. в тех же линукс дистрибутивах в каждом своя версия гнома со своими патчами. в этом и есть идея, в либе реализовано 99% потребностей, а остальные 1 можно решить форком, чтобы не перегружать основной функционал.

У тебя в коде куча хардкода и констант, рантайм ничего поменять нельзя, а для правок нужно править основной класс. sql запросы длиной в километр и работать с ними можешь наверное только ты, новый член команды будет месяц въезжать и ломать обратную совместимость, т.к. код даже тестами не обложишь. и при этом ты берешься проповедовать свой подход и наезжаешь на пример фаната, не как работают фасады споришь с фиксером?
Форкают от безысходности, если пакет медленно обновляется или произошел конфликт девелоперов (простой пример ffmpeg vs libav) . А по поводу SQL запросов длинной в километр) Имхо, SQL запрос нагляден в отличии от QB, а также не ограничивает в использовании имеющихся SQL механизмов, особенно когда дело доходит до триггеров и функций. Разработчик заводится в рамки этого "универсального" QB, а также не защещен от багов, плюс ко всему, когда наступает момент, что возможности QB не отвечают потребностям разработчика и хочется все выбросить http://phpclub.ru/talk/threads/Посоветуйте-sql-query-builder.76389/ .
 

WMix

герр M:)ller
Партнер клуба
хочется увидеть человека мечтающего писать триггеры и процедуры на qb.
 
Сверху