Форум русской поддержки Joomla!® CMS
07.12.2016, 01:55:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2 3 4   Вниз
  Добавить закладку  |  Печать  
Автор

Мой первый компонент

 (Прочитано 1467 раз)
0 Пользователей и 1 Гость смотрят эту тему.
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« : 06.07.2016, 11:46:51 »

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

Код
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

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

Репутация: +161/-5
Offline Offline

Пол: Мужской
Сообщений: 2653


step by step


« Ответ #1 : 06.07.2016, 12:24:44 »

Код:
global $vmlang;
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #2 : 06.07.2016, 20:22:13 »

ничего не изменилось
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Online Online

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #3 : 06.07.2016, 20:27:54 »

ничего не изменилось
Внимательнее читайте ошибку
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 За такой код оторвал бы руки.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #4 : 06.07.2016, 20:51:46 »

Внимательнее читайте ошибку
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
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #5 : 06.07.2016, 20:54:42 »

Попробуйте так:
Показать текстовый блок
Показать текстовый блок
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #6 : 06.07.2016, 21:04:39 »

Код
//$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
Живу я здесь
******

Репутация: +35/-3
Online Online

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #7 : 06.07.2016, 21:20:55 »

я беру текущий язык сайта, пишу его в переменную $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, 21:28:57 от Septdir » Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #8 : 06.07.2016, 21:27:12 »

все, разобрался
была пропущена строка VmConfig::loadConfig();

Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Online Online

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #9 : 06.07.2016, 21:29:02 »

Дополнение
Показать текстовый блок
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #10 : 06.07.2016, 21:30:14 »

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

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

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

Буду знать на будущее.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #11 : 06.07.2016, 21:39:49 »

Дополнение
Показать текстовый блок
из описания этого API я понял, что подгружаемый файл должен называться так же, как и класс, т.е. в данном случае, VmConfig.php
но я подгружаю файл VirtueMart, который называется Config.php и переименовать его не получится, а класс называется VmConfig
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #12 : 06.07.2016, 21:45:20 »

Цитировать
Ну и читать куда удобнее
$query->select
$query->from
$query->join
ну и т.п
А не sql в одну строку.

Это еще большой вопрос что удобнее читать. Прямой запрос выполнится быстрее. Я хоть и пользуюсь JDatabaseQuery оберткой в моделях но каких то особых преимуществ ее использования не вижу. Абсолютно абстрагироваться от sql запросов она не позволяет.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #13 : 06.07.2016, 22:03:09 »

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

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #14 : 06.07.2016, 22:45:25 »

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

Переделал такой запрос:
Код
$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();
Таким образом:
Код
$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, 22:49:19 от denism300 » Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #15 : 06.07.2016, 23:13:06 »

Цитировать
Например вы можете написать такую систему которую будете расширять плагинами!

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

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

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

Вопросы веб разработки - офигенно. Человек даже sql запросы простейшие писать не умеет.
« Последнее редактирование: 06.07.2016, 23:27:06 от zomby6888 » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #16 : 07.07.2016, 00:05:49 »

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


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


Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #17 : 07.07.2016, 00:20:34 »

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

ну да, еще учусь. а вы, наверное, с рождения все знали и умели?
вот, поправил. работает
Код
$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
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #18 : 07.07.2016, 00:23:11 »

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

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

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

Если запрос состоит из одной строки то нету никаких преимуществ. Только лишние вызовы методов, классов, переборки массивов. Когда нужно добавлять много условий в where на разных этапах то да это может быть удобнее.
« Последнее редактирование: 07.07.2016, 00:58:47 от zomby6888 » Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Online Online

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #19 : 07.07.2016, 01:43:15 »

Об этом я не думал. Но это наверное единственное преимущество. Впрочем если мне нужно будет писать что нибудь расширяемое плагинами то я могу и самостоятельно добавить события.
Разница в скорости если и есть то минимальна(ну сколько надо чтобы преобразовать код в запрос), и компенсируется удобством в использовании, не только плагинов, но и условий, и разумеется чтением, легкостью написание и корректировки.
Потому что вы фигню написали в коде. Вы не можете выбирать сразу из двух таблиц
Ну вообще-то можно, я где-то встречал такой пример, там как  union пойдет вроде. Могу порыться в закромах если интрестно.
Вопросы веб разработки - офигенно. Человек даже sql запросы простейшие писать не умеет.
Каждый учится по своему. Я лично учился по принципу сначала копируешь, потом понимаешь как работает методом проб и ошибок, а потом пишешь свое. Правда документацию по php и sql всегда держал открытой
ну да, еще учусь. а вы, наверное, с рождения все знали и умели?
denism300, давайте не будем нервничать. Я когда кому-то что-то объясняю по коду всегда говорю фразу "Читай код как машина и не пытайся делать ее умнее чем она есть".
Косабельно вашей проблемы в целом. Есть такое высказывание "Правильно заданный вопрос, половина ответа" Мы тут можем поправить ваш код, но не зная задачи целиком, это будет долго + если бы вы расписали что вы хотите получить,  возможно вам бы подсказали более аргономичное и оптимальное решение. Например я до сих под не понимаю на кой вам 3 таблицы. Одна итемов и два под разные языки, а потом объединять их в через иннер.
Второе, когда мы говорим о базе помимо того, указывайте в вопросе, что надо получить и структуру использованных таблиц
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #20 : 07.07.2016, 06:18:59 »

Цитировать
Разница в скорости если и есть то минимальна(ну сколько надо чтобы преобразовать код в запрос), и компенсируется удобством в использовании, не только плагинов, но и условий, и разумеется чтением, легкостью написание и корректировки.
Где же тут удобство и легкость написания о котором вы говорите если вместо:
Код
$db->setQuery('SELECT field from #__table WHERE id = 1')->loadResult();
 
Вам нужно написать:
Код
$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, 06:41:10 от zomby6888 » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #21 : 07.07.2016, 09:06:16 »

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


А вот может не надо лукавить?! Ведь запрос можно написать и так:
Код
$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, а человека в чем то обвиняете!  Grin
Как бы если сделать echo $query то выведется запрос который вам надо прочесть! Вам не надо вызывать $query->__toString()! прочтите что делает http://php.net/manual/ru/language.oop5.magic.php#object.tostring
« Последнее редактирование: 07.07.2016, 09:10:41 от Istaan » Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7533


Разраблю понемногу


« Ответ #22 : 07.07.2016, 09:58:05 »

Цитировать
Как бы если сделать echo $query то выведется запрос который вам надо прочесть! Вам не надо вызывать $query->__toString()!
Если уж на то пошло, то лучше всего
Код
echo $query->dump();
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Online Online

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #23 : 07.07.2016, 12:36:54 »

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

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


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

Если уж на то пошло, то лучше всего
Код
echo $query->dump();
Я обычно делал print_r ($query) тогда получаешь все операции с базой. количество результатов и прочие, когда с аяксом вожусь так частенько делаю, если запрос не работает как надо.
« Последнее редактирование: 07.07.2016, 12:46:13 от Septdir » Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #24 : 07.07.2016, 16:13:26 »

Цитировать
Вот сами не знаете основ ООП в 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, 18:16:37 от zomby6888 » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #25 : 07.07.2016, 23:43:00 »

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

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #26 : 08.07.2016, 00:22:47 »

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

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

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

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

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #27 : 08.07.2016, 01:07:44 »

А так ну незнаю может быть только полезно когда действительно запрос приходится разбрасывать по коду, добавлять условия и т.д
+ Так и есть.
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #28 : 08.07.2016, 04:39:39 »

+ Так и есть.

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

... 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, 04:57:55 от zomby6888 » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #29 : 08.07.2016, 07:42:53 »

грусть печаль ребята, а так пробовали?!
Код
$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, 07:54:51 от Istaan » Записан
Страниц: [1] 2 3 4   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet