Разные способы построения запроса в Joomla? - PullRequest
4 голосов
/ 26 марта 2012

Я только начинаю, это должно быть просто, но я не смог найти хороший источник, особенно с переключением с 1,5 на 1,6 / 1,7 / 2,5.

Создание компонента и среди другихпроблемы продолжают сталкиваться с проблемами синтаксиса.

Например, вот один способ, которым я строю запрос: [TYPE 1]

$query->SELECT('u.id as UserID
    , u.name AS Name
    , uppi.profile_value AS Hair
    , uppi2.profile_value AS Height
    ');
$query->FROM (' #__users AS u');
$query->LEFTJOIN (' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 ');
$query->LEFTJOIN (' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 ');
$query->GROUPBY (' u.id
    , u.name
    , uppi.profile_value
    ');

Другой способ: [TYPE 2]

$query->SELECT('u.id as UserID
    , u.name AS Name
    , uppi.profile_value AS Hair
    , uppi2.profile_value AS Height
    ')
->FROM (' #__users AS u')
->LEFTJOIN (' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 ')
->LEFTJOIN (' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 ')
->GROUPBY (' u.id
    , u.name
    , uppi.profile_value
    ');

Запутанная часть в обоих случаях заключается в том, что вызовы mysql, такие как "LEFTJOIN", представляют собой одно слово вместо двух.Итак, если я хочу использовать INSERT…ON DUPLICATE KEY UPDATE, я полностью потерян.

Вот третий: [TYPE 3]

$query->SELECT('u.id as UserID
    , u.name AS Name
    , uppi.profile_value AS Hair
    , uppi2.profile_value AS Height
    ');
$query->FROM (' #__users AS u');
$query->JOIN ('LEFT', ' #__user_profiles AS uppi ON u.id = uppi.user_id AND uppi.ordering = 1 ');
$query->JOIN ('LEFT', ' #__user_profiles AS uppi2 ON u.id = uppi2.user_id AND uppi2.ordering = 2 ');
$query->GROUPBY (' u.id
    , u.name
    , uppi.profile_value
    ');
$query->ORDER ('u.name ASC');

Это еще один способ, которым явидел запросы, созданные, но не могу приступить к работе [ EDITED - работает сейчас, спасибо @cppl!] [Type 4]

$query= "SELECT `u`.`id` as UserID
    , `u`.`name` AS Name
    , `uppi`.`profile_value` AS Hair
    , `uppi2`.`profile_value` AS Height
FROM `#__users` AS u
LEFT JOIN `#__user_profiles` AS uppi ON `u`.`id` = `uppi`.`user_id` AND `uppi`.`ordering` = 1 
LEFT JOIN `#__user_profiles` AS uppi2 ON `u`.`id` = `uppi2`.`user_id` AND `uppi2`.`ordering` = 2
    ";

I 'мы прошли учебник по Joomla MVC и Линде ... ни один из них на самом деле не решает эту проблему, кроме "вот какой-то код - PLOP".) Есть ли различия между ними?

2) Есть ли причина использовать один метод над другим?

3) Есть ли хороший источник для изучения различных способов их построения?Я искал несколько часов и не нашел ничего всеобъемлющего.

Спасибо!

1 Ответ

2 голосов
/ 26 марта 2012
  1. Типы 1,2 и 3 используют более новый объект JDatabaseQuery, тогда как тип 4 использует более старый стиль для задания запроса в виде строки SQL.
  2. Если тип 4 не работает, вы получаете ошибку SQL? (Вы включили режим отладки Joomla, чтобы можно было вывести ошибку SQL с профилем приложения?)
  3. JDatabaseQuery используется для предоставления абстракции, необходимой для поддержки нескольких баз данных SQL, а не только mySQL, поэтому у объекта $query есть такие функции, как select(), where(), join() и т. Д.
  4. Помните, что ->leftJoin() - это вызов PHP функции JDatabaseQuery с именем leftJoin() и, следовательно, должен быть одним словом, т.е. это не может быть два.
  5. leftJoin() на самом деле просто вызывает join('LEFT',$conditions), так что реализация удобочитаемости больше, чем функциональная разница.
  6. Таким образом, типы 1,2 и 3 фактически одинаковы, они просто имеют разную степень читабельности (например, IMHO типа 2 и 3 труднее читать и поддерживать, чем тип 1).

Вы, кажется, нашли все онлайн-источники для Joomla! документация, кроме Joomla! Группы Google ( CMS Dev , General Dev и Platform Dev ).

Единственный источник - Эндрю Эдди " Learn the Joomla! ". Я сам не использовал материал Эндрю, но слышал много хорошего об этом в последней Joomla! День, который я посетил.

Редактировать Исходя из ошибки, я бы сказал, это потому, что у вас есть идентификатор u.id, заключенный в один идентификатор. Попробуйте что-то вроде:

SELECT `u`.`id` AS "UserID" FROM `#__users` AS `u`
...