Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 99 Ответов
  • 5060 Просмотров
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Мой первый компонент
« : 06.07.2016, 10:46:51 »
Пишу небольшую обработку для компонента VirtueMart.
В общем, не получается вставить в имя таблицы взятое из конфигурации значение.

Код: php
require_once(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_virtuemart'.DS.'helpers'.DS.'config.php');
$vmlang = VmConfig::$vmlang; //получаем код языка
 
$join[] = ' LEFT JOIN `#__virtuemart_products` AS p ON p.`virtuemart_product_id` = pl.`virtuemart_product_id`';
        $join[] = ' LEFT JOIN `#__vmxg_lt` AS v ON v.id = p.`virtuemart_product_id`';
 
$query  = ' SELECT SQL_CALC_FOUND_ROWS v.*, pl.product_name FROM `#__virtuemart_products_' . $vmlang . '` AS pl '.implode(' ', $join);
        $query .= ' WHERE '.implode(' AND ', $where).' '.$order;

на выходе имеем ошибку:
Цитировать
Table 'sitebase.#__virtuemart_products_' doesn't exist SQL=SELECT SQL_CALC_FOUND_ROWS v.*, pl.product_name FROM `#__virtuemart_products_` AS pl LEFT JOIN `#__virtuemart_products` AS p ON p.`virtuemart_product_id` = pl.`virtuemart_product_id` LEFT JOIN `#__vmxg_lt` AS v ON v.id = p.`virtuemart_product_id` WHERE p.published = 1 ORDER BY product_name ASC LIMIT 0, 20

если вместо
Код: php
`#__virtuemart_products_' . $vmlang . '`
явно указать имя таблицы:
Код: PHP
`#__virtuemart_products_ru_ru`
то все работает
« Последнее редактирование: 30.09.2016, 09:49:55 от Taatshi »
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
ничего не изменилось
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
ничего не изменилось
Внимательнее читайте ошибку
Table 'sitebase.#__virtuemart_products_' doesn't exist
Таблица virtuemart_products_ не найдена.

У тебя в коде обращение тут
$query  = ' SELECT SQL_CALC_FOUND_ROWS v.*, pl.product_name FROM `#__virtuemart_products_'

Что-то мне подсказывает что таблица называется #__virtuemart_products без '_' в конце

P.S За такой код оторвал бы руки.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Внимательнее читайте ошибку
Table 'sitebase.#__virtuemart_products_' doesn't exist
Таблица virtuemart_products_ не найдена.

У тебя в коде обращение тут
$query  = ' SELECT SQL_CALC_FOUND_ROWS v.*, pl.product_name FROM `#__virtuemart_products_'

Что-то мне подсказывает что таблица называется #__virtuemart_products без '_' в конце
таблица называется #__virtuemart_products_ru_ru для русской локализации и #__virtuemart_products_en_en для английской.
соответственно, я беру текущий язык сайта, пишу его в переменную $vmlang и пытаюсь вставить и имя таблицы.

P.S За такой код оторвал бы руки.
подскажи, как правильно - буду благодарен, поскольку еще только учусь
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Попробуйте так:
Спойлер
[свернуть]
Спойлер
[свернуть]
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Код: php-brief
//$vmlang = VmConfig::$vmlang; //получаем код языка
 
$join[] = ' LEFT JOIN `#__virtuemart_products` AS p ON p.`virtuemart_product_id` = pl.`virtuemart_product_id`';
$join[] = ' LEFT JOIN `#__vmxg_lt` AS v ON v.id = p.`virtuemart_product_id`';
 
$query  = ' SELECT SQL_CALC_FOUND_ROWS v.*, pl.product_name FROM `#__virtuemart_products_' . VmConfig::$vmlang . '` AS pl '.implode(' ', $join);
$query .= ' WHERE '.implode(' AND ', $where).' '.$order;

пробовал. тоже самое
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
я беру текущий язык сайта, пишу его в переменную $vmlang и пытаюсь вставить и имя таблицы.
А ты вообще язык получаешь.
Код
VmConfig::$vmlang
$vmlang  - это что? ты ее вообще объявлял
Начни с того чтобы просто получить язык.
Просто через echo или принт.
Язык сайта можно получить и через JFactory::getLanguage();
Если нужен кофиг, то есть несколько способов. Можно через helper, можно через JComponentHelper::getParams(), можно через JFactory::getApplication()->getParams()
Как лучше решать тебе. Без всей картины сказать сложно, лично я vm вообще не переношу. (Топик не в разделе vm поэтому и отвечаю).

Потише. И не торопитесь кому-то руки отрывать - нужна таблица #__virtuemart_products_ru_RU.[/spoiler]
Руки оторвал бы не за таблицу( хотя смотря какая задача возможно и не нужно тут 3 таблицы, а достаточно модифицировать основную.) а за написание кода коннекта. Элемента зачем запихивать 2 join в массив и потом через две строки использовать implode
Спойлер
[свернуть]

« Последнее редактирование: 06.07.2016, 20:28:57 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
все, разобрался
была пропущена строка VmConfig::loadConfig();

*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Дополнение
Спойлер
[свернуть]
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Руки оторвал бы не за таблицу( хотя смотря какая задача возможно и не нужно тут 3 таблицы, а достаточно модифицировать основную.) а за написание кода коннекта. Элемента зачем запихивать 2 join в массив и потом через две строки использовать implode

в коде это не через 2 строки. я не стал приводить целиком весь код.

Ну и читать куда удобнее
$query->select
$query->from
$query->join
ну и т.п
А не sql в одну строку.
Ссылка на документацию JDatabase https://docs.joomla.org/Selecting_data_using_JDatabase

Буду знать на будущее.
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Дополнение
Спойлер
[свернуть]
из описания этого API я понял, что подгружаемый файл должен называться так же, как и класс, т.е. в данном случае, VmConfig.php
но я подгружаю файл VirtueMart, который называется Config.php и переименовать его не получится, а класс называется VmConfig
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Цитировать
Ну и читать куда удобнее
$query->select
$query->from
$query->join
ну и т.п
А не sql в одну строку.

Это еще большой вопрос что удобнее читать. Прямой запрос выполнится быстрее. Я хоть и пользуюсь JDatabaseQuery оберткой в моделях но каких то особых преимуществ ее использования не вижу. Абсолютно абстрагироваться от sql запросов она не позволяет.
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Это еще большой вопрос что удобнее читать. Прямой запрос выполнится быстрее. Я хоть и пользуюсь JDatabaseQuery оберткой в моделях но каких то особых преимуществ ее использования не вижу. Абсолютно абстрагироваться от sql запросов она не позволяет.
А что JDatabaseQuery делает кривой запрос?)
преимуществ куча!
Например вы можете написать такую систему которую будете расширять плагинами! Например плагин в котором можно будет расширить запрос!
Так вот что будет проще добавить какой то запрос в простую строку или в JDatabaseQuery?
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Ну и читать куда удобнее
$query->select
$query->from
$query->join
ну и т.п
А не sql в одну строку.
Ссылка на документацию JDatabase https://docs.joomla.org/Selecting_data_using_JDatabase

Переделал такой запрос:
Код: php
$db = JFactory::getDBO();
$query = 'SELECT virtuemart_category_id as category_id, category_parent_id, category_name
$query .= FROM #__virtuemart_categories_'.VMLANG.', #__virtuemart_category_categories
$query .= WHERE #__virtuemart_categories_'.VMLANG.'.virtuemart_category_id = #__virtuemart_category_categories.category_child_id ';
$db->setQuery($query);
$catlist = $db->loadObjectList();
Таким образом:
Код: php
$db =JFactory::getDBO();
$query = $db->getQuery(true);
$query -> select($db->quoteName(array('virtuemart_category_id AS category_id', 'category_parent_id', 'category_name')));
$query -> from($db->quoteName('#__virtuemart_categories_'.VmConfig::$vmlang.', #__virtuemart_category_categories'));
$query->where($db->quoteName('#__virtuemart_categories_'.VmConfig::$vmlang.'.virtuemart_category_id')." = ". $db->quoteName('#__virtuemart_category_categories.category_child_id '));
$db->setQuery($query);
$catlist = $db->loadObjectList();

на выходе получил ошибку:
Цитировать
Ошибка 0 Identifier name '#__virtuemart_categories_ru_ru, #__virtuemart_category_categories' is too long SQL=SELECT `virtuemart_category_id`,`category_parent_id`,`category_name` FROM `#__virtuemart_categories_ru_ru, #__virtuemart_category_categories` WHERE `#__virtuemart_categories_ru_ru`.`virtuemart_category_id` = `#__virtuemart_category_categories`.`category_child_id `
Я так понимаю, что ему не нравится слишком длинное имя идентификатора. Но в первоначальном варианте все работало.
« Последнее редактирование: 06.07.2016, 21:49:19 от denism300 »
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Цитировать
Например вы можете написать такую систему которую будете расширять плагинами!

Об этом я не думал. Но это наверное единственное преимущество. Впрочем если мне нужно будет писать что нибудь расширяемое плагинами то я могу и самостоятельно добавить события.

Цитировать
Я так понимаю, что ему не нравится слишком длинное имя идентификатора. Но в первоначальном варианте все работало.

Потому что вы фигню написали в коде. Вы не можете выбирать сразу из двух таблиц. Используйте join метод раз уж решили через JDatabaseQuery работать.

Вопросы веб разработки - офигенно. Человек даже sql запросы простейшие писать не умеет.
« Последнее редактирование: 06.07.2016, 22:27:06 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Об этом я не думал. Но это наверное единственное преимущество. Впрочем если мне нужно будет писать что нибудь расширяемое плагинами то я могу и самостоятельно добавить события.
То есть напишите костыль ) Я просто с ходу не могу придумать преимущества, но факт в том что запрос можно собрать в любой последовательности, и как угодно, в любом месте! Строкой же нужно строго соблюсти все последовательности иначе будет бо бо..


Потому что вы фигню написали в коде. Вы не можете выбирать сразу из двух таблиц. Используйте join метод раз уж решили через JDatabaseQuery работать.
что честно http://www.mysql.ru/docs/man/Multiple_tables.html  ?)) думаю вам лучше удалить последний абзац )))


*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
Вопросы веб разработки - офигенно. Человек даже sql запросы простейшие писать не умеет.

ну да, еще учусь. а вы, наверное, с рождения все знали и умели?
вот, поправил. работает
Код: php
$db =JFactory::getDBO();
$query = $db->getQuery(true);
$query -> select($db->quoteName(array('virtuemart_category_id', 'category_parent_id', 'category_name')));
$query -> from($db->quoteName('#__virtuemart_categories_' . VmConfig::$vmlang, 'a'));
$query -> join('INNER', $db->quoteName('#__virtuemart_category_categories', 'b'). 'ON (' . $db->quoteName('a.virtuemart_category_id'). ' = ' . $db->quoteName('b.category_child_id'). ')');
$db->setQuery($query);
$catlist = $db->loadObjectList();
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Цитировать
то честно http://www.mysql.ru/docs/man/Multiple_tables.html  ?)) думаю вам лучше удалить последний абзац )))

Да это тот же join, только синтаксис другой. Вы сделайте попробуйте explain такого запроса. Еще не понятно как там используются ключи и работают объеденения. Лучше уж использовать обычный join.

Цитировать
Я просто с ходу не могу придумать преимущества, но факт в том что запрос можно собрать в любой последовательности, и как угодно, в любом месте!

Если запрос состоит из одной строки то нету никаких преимуществ. Только лишние вызовы методов, классов, переборки массивов. Когда нужно добавлять много условий в where на разных этапах то да это может быть удобнее.
« Последнее редактирование: 06.07.2016, 23:58:47 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Об этом я не думал. Но это наверное единственное преимущество. Впрочем если мне нужно будет писать что нибудь расширяемое плагинами то я могу и самостоятельно добавить события.
Разница в скорости если и есть то минимальна(ну сколько надо чтобы преобразовать код в запрос), и компенсируется удобством в использовании, не только плагинов, но и условий, и разумеется чтением, легкостью написание и корректировки.
Потому что вы фигню написали в коде. Вы не можете выбирать сразу из двух таблиц
Ну вообще-то можно, я где-то встречал такой пример, там как  union пойдет вроде. Могу порыться в закромах если интрестно.
Вопросы веб разработки - офигенно. Человек даже sql запросы простейшие писать не умеет.
Каждый учится по своему. Я лично учился по принципу сначала копируешь, потом понимаешь как работает методом проб и ошибок, а потом пишешь свое. Правда документацию по php и sql всегда держал открытой
ну да, еще учусь. а вы, наверное, с рождения все знали и умели?
denism300, давайте не будем нервничать. Я когда кому-то что-то объясняю по коду всегда говорю фразу "Читай код как машина и не пытайся делать ее умнее чем она есть".
Косабельно вашей проблемы в целом. Есть такое высказывание "Правильно заданный вопрос, половина ответа" Мы тут можем поправить ваш код, но не зная задачи целиком, это будет долго + если бы вы расписали что вы хотите получить,  возможно вам бы подсказали более аргономичное и оптимальное решение. Например я до сих под не понимаю на кой вам 3 таблицы. Одна итемов и два под разные языки, а потом объединять их в через иннер.
Второе, когда мы говорим о базе помимо того, указывайте в вопросе, что надо получить и структуру использованных таблиц
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Цитировать
Разница в скорости если и есть то минимальна(ну сколько надо чтобы преобразовать код в запрос), и компенсируется удобством в использовании, не только плагинов, но и условий, и разумеется чтением, легкостью написание и корректировки.
Где же тут удобство и легкость написания о котором вы говорите если вместо:
Код: php
$db->setQuery('SELECT field from #__table WHERE id = 1')->loadResult();
Вам нужно написать:
Код: php
$query = $db->getQuery(true);
$query->select('field');
$query->from('#__table');
$query->where('id = 1');
$db->setQuery($query)->loadResult();

В плане читаемости по мне так удобнее прочесть запрос когда он в одном месте а не разбросан по коду кусками. Чтобы прочесть запрос который в $query мне приходится вызывать $query->__toString(); Даже в моем примере читаемость лучше в простом запросе. Для более менее сложных запросов применение вполне разумно, я писал уже что я и сам в моделях использую эту обертку на всякий случай.

Цитировать
Ну вообще-то можно, я где-то встречал такой пример, там как  union пойдет вроде. Могу порыться в закромах если интрестно.

union это вообще из другой Opera. Речь идет о выборке из двух таблиц. Тут либо писать подзапросы(может кстатии подзапросы вы имеете ввиду?) либо применять join-ы, явным или неявным способом. Лучше это сделать явным образом.
Цитировать
Каждый учится по своему. Я лично учился по принципу сначала копируешь, потом понимаешь как работает методом проб и ошибок, а потом пишешь свое. Правда документацию по php и sql всегда держал открытой

Вы тут сами обещали ТС оторвать руки недавно) Причем за практически те же операции что делает метод where и join в JDatabaseQuery. Они там тоже формируют массивы из которых потом собирают запрос.
« Последнее редактирование: 07.07.2016, 05:41:10 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Где же тут удобство и легкость написания о котором вы говорите если вместо:
Код: php
$db->setQuery('SELECT field from #__table WHERE id = 1')->loadResult();
Вам нужно написать:
Код: php
$query = $db->getQuery(true);
$query->select('field');
$query->from('#__table');
$query->where('id = 1');
$db->setQuery($query)->loadResult();


А вот может не надо лукавить?! Ведь запрос можно написать и так:
Код: php
$query = $query = $db->getQuery(true)->select('field')->from('#__table')->where('id=1');
$db->setQuery($query)->loadResult();
и оно будет более читаемо! потому что ключевые елементы запроса это методы класса, а что брать в скобочках строкой! это вы написали "'SELECT field from #__table WHERE id = 1" а многие не замарачиваются и пишут так: select field from table where id=1 ... и попробуй почитать эту стену текста!


В плане читаемости по мне так удобнее прочесть запрос когда он в одном месте а не разбросан по коду кусками. Чтобы прочесть запрос который в $query мне приходится вызывать $query->__toString();

Вот сами не знаете основ ООП в PHP, а человека в чем то обвиняете!  ;D
Как бы если сделать echo $query то выведется запрос который вам надо прочесть! Вам не надо вызывать $query->__toString()! прочтите что делает http://php.net/manual/ru/language.oop5.magic.php#object.tostring
« Последнее редактирование: 07.07.2016, 08:10:41 от Istaan »
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Цитировать
Как бы если сделать echo $query то выведется запрос который вам надо прочесть! Вам не надо вызывать $query->__toString()!
Если уж на то пошло, то лучше всего
Код: php-brief
echo $query->dump();
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Где же тут удобство и легкость написания о котором вы говорите если вместо:
В плане читаемости по мне так удобнее прочесть запрос когда он в одном месте а не разбросан по коду кусками. Чтобы прочесть запрос который в $query мне приходится вызывать $query->__toString(); Даже в моем примере читаемость лучше в простом запросе. Для более менее сложных запросов применение вполне разумно, я писал уже что я и сам в моделях использую эту обертку на всякий случай.
В простом, возможно. Но не когда у тебя с десяток условий. Да даже 2 условия уже получается длинная строка, особенно когда идет сравнение дат between or и прочие. В которой потом ты умаешься искать где описался.
А это все понадобиться равно или поздно. Запрос с один условием огромная редкость.

union это вообще из другой Opera. Речь идет о выборке из двух таблиц.
Uion и есть выборка из нескольких таблиц. А Inner Lef Right и т.п это объединение.


Вы тут сами обещали ТС оторвать руки недавно) Причем за практически те же операции что делает метод where и join в JDatabaseQuery. Они там тоже формируют массивы из которых потом собирают запрос.
Руки за написание. Стены и выполенние лишней операции. Тоже самое по смыслу да, но не по функциям и есть огромная разница когда ты один раз написал(используешь существующий) класс и функции работы с базой и им пользуешься или у тебя есть все функции ноты зачем-то их пишешь снова причем не в самом лучшем виде.

Если уж на то пошло, то лучше всего
Код: php-brief
echo $query->dump();
Я обычно делал print_r ($query) тогда получаешь все операции с базой. количество результатов и прочие, когда с аяксом вожусь так частенько делаю, если запрос не работает как надо.
« Последнее редактирование: 07.07.2016, 11:46:13 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Цитировать
Вот сами не знаете основ ООП в PHP, а человека в чем то обвиняете!  Grin
Как бы если сделать echo $query то выведется запрос который вам надо прочесть! Вам не надо вызывать $query->__toString()! прочтите что делает http://php.net/manual/ru/language.oop5.magic.php#object.tostring

Ну да конечно не знаю, пристыдили. Вообще то я это делаю в отладчике, если бы я выводил значение переменной в коде я бы сделал просто echo $query. Я не занимаюсь правкой кода если мне нужно узнать значение переменной. И это не основы ООП в PHP а всего лишь один из "магических" методов.

Цитировать
А вот может не надо лукавить?! Ведь запрос можно написать и так:
$query = $query = $db->getQuery(true)->select('field')->from('#__table')->where('id=1');
$db->setQuery($query)->loadResult();
и оно будет более читаемо! потому что ключевые елементы запроса это методы класса, а что брать в скобочках строкой! это вы написали "'SELECT field from #__table WHERE id = 1" а многие не замарачиваются и пишут так: select field from table where id=1 ... и попробуй почитать эту стену текста!

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

Цитировать
Uion и есть выборка из нескольких таблиц. А Inner Lef Right и т.п это объединение.

Вы все перепустали. Возьмите словарь и переведите слово Union.

Цитировать
Я обычно делал print_r ($query) тогда получаешь все операции с базой. количество результатов и прочие, когда с аяксом вожусь так частенько делаю, если запрос не работает как надо.

Поздравляю, а я использую дебагер. $query->dump() возьму на заметку. Хотя разница небольшая.

P.S. Вижу теперь что $query->dump() специально для отладки сделан. Спасибо за подсказку. Странно что я раньше не замечал этого метода.
« Последнее редактирование: 07.07.2016, 17:16:37 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Писанины все равно больше. И где же читаемость? В упор не вижу лучшую читаемость. Совершенно бесполезная, длинная цепочка вызовов. Да и кстати где там плагины подключаются, можете показать? Я чего-то не могу найти в исходниках.
Я не говорил про плагины в запросе! это бред, я про написание своего абстрактного коня в вакууме к которому можно прикрутить плагины  которые будут запрос менять!
Но вы забываете про другой аспект разработки.. под название ООП! Где можно любой класс расширить, и тот же класс JDatabaseQuery расширить так что можно будет написать например так:
$query = $db->getQuery(true)->getArticle(1);
а потом как угодно расширить это запрос!
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Ага, офигенски он расширяется. Зайдите в JDatabaseDriver и посмотрите метод getQuery():

Код: php
$class = 'JDatabaseQuery' . ucfirst($this->name);

Я даже не могу задать свое имя так как оно завязано на имени класса драйвера. Тоесть фактически мне еще надо класс драйвера унаследовать чтобы имя изменить. А если я расширяю класс драйвера своим плагином то зачем мне вообще сдалась эта обертка? Что же я без нее не смогу запрос изменить? Да легко. Мне достаточно перегрузить метод setQuery класса драйвера.

Если бы этот класс позволял бы абстрагироватся от драйвера БД и от sql запросов в целом тогда да, это была бы реально полезная фича, что то типа ORM. А так ну незнаю может быть только полезно когда действительно запрос приходится разбрасывать по коду, добавлять условия и т.д
« Последнее редактирование: 07.07.2016, 23:47:26 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
А так ну незнаю может быть только полезно когда действительно запрос приходится разбрасывать по коду, добавлять условия и т.д
+ Так и есть.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
+ Так и есть.

На самом деле и тут тоже есть проблемы. К примеру вот мне понадобилось недавно разрулить такой вот запрос в модели:

... WHERE a.`channel_id` = 6 AND (a.`day_of_week` = 1 AND a.`start_time` > '05:40' OR a.`day_of_week` = 2 AND a.`start_time` < '05:40')

Казалось бы вот эта конструкция должна работать:
Спойлер
[свернуть]

Ан нет! Что я получаю в итоге:

... WHERE a.`channel_id` = 6 AND (`a`.`day_of_week` = 1 AND `a`.`start_time` > '05:40' AND `a`.`day_of_week` = 2 AND `a`.`start_time` < '05:40')

Оказывается в методе query->where() второй параметр (оператор сравнения OR или AND) устанавливается только при первой инициализации where и действует на все последующие условия! Пришлось писать так:

Спойлер
[свернуть]

И вот возникает вопрос. А не проще ли вообще в таком случае написать запрос в одну строку. И не надо делать дамп чтобы понять что в запросе. Это к вопросу о читаемости.


« Последнее редактирование: 08.07.2016, 03:57:55 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
грусть печаль ребята, а так пробовали?!
Код: php
$db = JFactory::getDbo();

class ExpansionQuery extends JDatabaseQuery
{
public function getArticle( $id )
{
$this->clear();
$this->select( '*' )->from( '#__content' )->where( 'id=' . $id );
return $this;
}
}

$query = new ExpansionQuery( $db );
echo $query->getArticle( 1 );
« Последнее редактирование: 08.07.2016, 06:54:51 от Istaan »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Только первый абзац

Автор warlocksp

Ответов: 0
Просмотров: 535
Последний ответ 28.11.2017, 15:24:15
от warlocksp