На http://docs.joomla.org/Selecting_data_using_JDatabase нет документированного метода написания подзапроса с использованием JDatabase.
https://gist.github.com/gunjanpatel/8663333 иллюстрирует один из способов сделать это с помощью нескольких пропущенных битов:
$subQuery = $db->getQuery(true);
$query = $db->getQuery(true);
// Create the base subQuery select statement.
$subQuery->select('*')
->from($db->quoteName('#__sub_table'))
->where($db->quoteName('subTest') . ' = ' . $db->quote('1'));
// Create the base select statement.
$query->select('*')
->from($db->quoteName('#__table'))
->where($db->quoteName('state') . ' = ' . $db->quote('1'))
->where($db->quoteName('subCheckIn') . ' IN (' . $subQuery->__toString() . ')')
->order($db->quoteName('ordering') . ' ASC');
// Set the query and load the result.
$db->setQuery($query);
Это кажется хорошим, правдоподобным подходом, но есть ли лучший?
__toString()
) - это «волшебный» метод.Ответы:
Да, насколько я понимаю, способ, которым вы создали подзапрос, - тот, который принят большинством разработчиков расширений joomla.
Я использую тот же метод на некоторых из моих расширений и пользовательских расширений, сделанных для клиентов.
Не существует «официального» способа сделать это, но выполнение, как вы показали, позволяет использовать построитель запросов и при этом сохранять хорошую читабельность.
источник
AFAIK Не существует встроенного способа выполнения простых подзапросов, что, вероятно, является недостатком системы и должно быть исправлено с помощью PR.
Однако я не вижу проблем с вашим примером - кажется достаточно разумным.
~~~
Вот пример в ответ на комментарий @ DavidFritsch ниже. Однако чем больше я об этом думаю, тем лучше мне нравится более простой подход, отображаемый в ОП. Это более понятно, что происходит.
источник
subQuerySelect
метод, в котором он позволяет делать это более «чисто». Я отредактирую свой ответ, чтобы предоставить и пример.Существует также способ выполнения запросов, которые содержат подзапросы с использованием API платформы Joomla. Основная идея о том, как использовать подзапросы, основана на gunjanpatel .
Вот пример выполнения запросов на моделях с вложенным множеством :
SQL-запрос:
и преобразованный запрос, который будет выполнен Joomla:
источник
Я предложу свою версию сниппета, затем объясню свое обоснование и включу цитаты из руководства по стандартам кодирования Joomla (которое будет отформатировано как цитата).
Сначала я пишу самые внутренние запросы и перехожу к самым внешним запросам. Это позволяет мне связать все методы построения запросов непосредственно с
getQuery()
методом. По сути, имя переменной записывается только один раз при построении отдельного запроса.Вот потрясающий пример некоторого сложного вложения запросов (когда я думал, что это было мило - выстроить стрелки в цепочку).
Я стараюсь избегать нескольких
select()
и / илиwhere()
вызовов в рамках одного запроса, потому что я видел, что это приводит к путанице с менее опытными разработчиками . Поскольку эти методы принимают массивы, я считаю их более удобными для чтения и лучшей практики кодирования.и, наконец, самая спорная тема ...
Я очень противоречив в этой позиции. Когда я впервые приехал в Joomla в прошлом году, я подумал, что не собираюсь делать бесполезные вызовы (без пользы для стабильности, безопасности, читаемости запроса) статических значений! Тем не менее, мой работодателю нравится идея Лишних линий Joomla, и я должен признать , что я , как правило, высокую оценку для правил, поэтому я поливанием моих запросов с
quote()
,(int)
иquoteName()
что также означает кучку конкатенации (все правильно расставлены). Конечными результатами моей работы являются ужасно раздутые блоки запросов, которые даже мне трудно разглядеть. Наихудшие / самые длинные строки, которые не поддаются вертикальному наложению, - этоjoin()
вызовы из-за имени таблицы, псевдонимаON
, а затем одного или нескольких условий, которые могут требовать или не требовать цитирования.Я могу оценить, что эта политика реализована с учетом требований безопасности для начинающих разработчиков, но я уверен, что она хотела бы, чтобы эта политика была каким-то образом смягчена чувством, что не все кодировщики Joomla являются невежественными копировщиками. Я имею в виду, посмотрим, как чистый и краткий код выглядит без ненужных вызовов.Что касается зачистки:
*
в своих предложениях SELECT__toString()
ASC
потому что это направление сортировки по умолчаниюисточник