Запрос

С появлением Joomla 1.6 поменялся метод работы с базой данных, хотя и прошлый вариант по-прежнему поддерживается.С появлением Joomla 1.6 поменялся метод работы с базой данных, хотя и прошлый вариант по-прежнему поддерживается.

Для получения нового экземпляра класса JDatabaseQuery мы используем метод getquery JDatabaseDriver. 

$db = JFactory::getDbo();
$query = $db->getQuery(true);

 

В JDatabaseDriver:: метод getquery принимает необязательный аргумент, $new, который может быть true или false (по умолчанию значение false).

Некоторые из наиболее часто используемых методов включают в себя: include; select, from, join, where и order. Существуют также методы, такие как insert, update и delete для изменения записей в базе данных. Вы можете создать практически любой запрос к базе данных без ущерба для мобильности кода.

 

Выбор записей из одной таблицы

Ниже приведен пример создания запроса с помощью класса JDatabaseQuery. Используя методы select, from, where и order, можно создавать гибкие, легко читаемые и портативные запросы к базе данных. 

// Подключение к БД
$db = JFactory::getDbo();

// Создание нового запроса
$query = $db->getQuery(true);

// Выбрать все записи из таблицы профилей юзера, в которых ключ профиля начинается с "custom.".
// Сортируем по алфавиту
$query->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')));
$query->from($db->quoteName('#__user_profiles'));
$query->where($db->quoteName('profile_key') . ' LIKE '. $db->quote('\'custom.%\''));
$query->order('ordering ASC');

// Получаем запрос
$db->setQuery($query);

// Получаем результат как список объектов stdClass 
$results = $db->loadObjectList();

 

 Упрощаем написание выборки 

$query
    ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
    ->from($db->quoteName('#__user_profiles'))
    ->where($db->quoteName('profile_key') . ' LIKE '. $db->quote('\'custom.%\''))
    ->order('ordering ASC');

 

Подсчитываем количество статей в каждой категории  

$query
    ->select( array('catid', 'COUNT(*)') )
    ->from($db->quoteName('#__content'))
    ->group($db->quoteName('catid'));

 

Ограничение может быть установлено в запросе с помощью "setLimit". Например, следующий запрос будет возвращать до 10 записей. 

$query
    ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
    ->from($db->quoteName('#__user_profiles'))
    ->setLimit('10');

 

Выбор записей из нескольких таблиц

Используя методы объединения JDatabaseQuery, мы можем выбирать записи из нескольких связанных таблиц. Общий метод «join» принимает два аргумента; «Тип» соединения (inner, outer, left, right) и условие соединения. В следующем примере вы заметите, что мы можем использовать все ключевые слова, которые мы обычно использовали бы, если бы мы писали собственный SQL-запрос, включая ключевое слово AS для таблиц псевдонимов и ключевое слово ON для создания связей между таблицами. Также обратите внимание, что псевдоним таблицы используется во всех методах, которые ссылаются на столбцы таблицы (I.e. select, where, order). 

// Get a db connection.
$db = JFactory::getDbo();

// Create a new query object.
$query = $db->getQuery(true);

// Select all articles for users who have a username which starts with 'a'.
// Order it by the created date.
// Note by putting 'a' as a second parameter will generate `#__content` AS `a`
$query
    ->select(array('a.*', 'b.username', 'b.name'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
    ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
    ->order($db->quoteName('a.created') . ' DESC');

// Reset the query using our newly populated query object.
$db->setQuery($query);

// Load the results as a list of stdClass objects (see later for more options on retrieving data).
$results = $db->loadObjectList();

Метод объединения в примере, указанном выше, позволяет нам запрашивать как контент, так и пользовательские таблицы, извлекать статьи с деталями профиля автора. Метод объединения в примере, указанном выше, позволяет нам запрашивать как контент, так и пользовательские таблицы, извлекать статьи с деталями профиля автора. 

 

Существуют также удобные методы для объединения запросов: 

Мы можем использовать несколько join для выборки данныъ из более чем двух таблиц. 

$query
    ->select(array('a.*', 'b.username', 'b.name', 'c.*', 'd.*'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
    ->join('LEFT', $db->quoteName('#__user_profiles', 'c') . ' ON (' . $db->quoteName('b.id') . ' = ' . $db->quoteName('c.user_id') . ')')
    ->join('RIGHT', $db->quoteName('#__categories', 'd') . ' ON (' . $db->quoteName('a.catid') . ' = ' . $db->quoteName('d.id') . ')')
    ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
    ->order($db->quoteName('a.created') . ' DESC');

Обратите внимание, что $query делает код более понятным для длинных запросов.

 

В некоторых случаях вам также необходимо использовать AS при выборе элементов, чтобы избежать конфликтов имен столбцов. В этом случае несколько операторов выбора можно связать в сочетании с использованием второго параметра $db-> quoteName

$query
    ->select('a.*')
    ->select($db->quoteName('b.username', 'username'))
    ->select($db->quoteName('b.name', 'name'))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
    ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
    ->order($db->quoteName('a.created') . ' DESC');

 

Второй массив также может использоваться в качестве второго параметра оператора select для заполнения значений AS. Не забудьте включить нули во втором массиве, чтобы они соответствовали столбцам в первом массиве, для которых вы не хотите использовать AS

$query
    ->select(array('a.*'))
    ->select($db->quoteName(array('b.username', 'b.name'), array('username', 'name')))
    ->from($db->quoteName('#__content', 'a'))
    ->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('a.created_by') . ' = ' . $db->quoteName('b.id') . ')')
    ->where($db->quoteName('b.username') . ' LIKE \'a%\'')
    ->order($db->quoteName('a.created') . ' DESC');

 

Вывод результатов запроса

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

Одиночный результат

loadResult()

Используйте loadResult(), когда вы ожидаете только одного значения из запроса к базе данных. 

loadresult

 

Такой вариант часто используется для запроса «count» для получения нескольких записей: 

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('COUNT(*)');
$query->from($db->quoteName('#__my_table'));
$query->where($db->quoteName('name')." = ".$db->quote($value));

// Reset the query using our newly populated query object.
$db->setQuery($query);
$count = $db->loadResult();

 

или когда необходимо одно поле из одной строки таблицы (или, возможно, одно поле из первой возвращаемой строки). 

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('field_name');
$query->from($db->quoteName('#__my_table'));
$query->where($db->quoteName('some_name')." = ".$db->quote($some_value));

$db->setQuery($query);
$result = $db->loadResult();

 

Результаты для одной строки

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

singlerow

 

loadRow()

loadRow() возвращает индексированный массив из одной записи в таблице: 

. . .
$db->setQuery($query);
$row = $db->loadRow();
print_r($row);

 

даст 

Array ( [0] => 1, [1] => John Smith, [2] => johnsmith @ domain.example, [3] => johnsmith ) 

 

Вы можете получить доступ к отдельным значениям, используя: 

$row['index'] // e.g. $row['2']

 

Стоит иметь ввиду:

  1. Индексация массива начинается с нуля.
  2. Хотя вы и можете повторить вызов, чтобы получить следующие строки, лучше воспользоваться одной из функций, возвращающих несколько строк сразу.

 

loadAssoc()

Возвращает ассоциативный массив одинарной записи в таблице

. . .
$db->setQuery($query);
$row = $db->loadAssoc();
print_r($row);
will give:

 

вернет 

Array ( [id] => 1, [name] => John Smith, [email] => johnsmith @ domain.example, [username] => johnsmith )

 

Вы можете получить доступ к отдельным значениям, используя: 

$row['name'] // e.g. $row['email']

 

Стоит иметь ввиду:

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

 

loadObject()

LoadObject возвращает объект PHP из одной записи в таблице: 

. . .
$db->setQuery($query);
$result = $db->loadObject();
print_r($result);

 

вернет 

stdClass Object ( [id] => 1, [name] => John Smith, [email] => johnsmith @ domain.example, [username] => johnsmith )

 

Вы можете получить доступ к отдельным значениям, используя: 

$result->index // e.g. $result->email

 

Стоит иметь ввиду:

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

 

Результаты для одной колонки

Каждая из этих функций возвращает один столбец из базы данных.

 

singlecolumn

 

loadColumn()

LoadColumn () возвращает индексированный массив из одного столбца в таблице: 

$query->select('name'));
      ->from . . .";
. . .
$db->setQuery($query);
$column= $db->loadColumn();
print_r($column);

 

вернет 

Array ( [0] => John Smith, [1] => Magda Hellman, [2] => Yvonne de Gaulle )

 

Вы можете получить доступ к отдельным значениям, используя: 

$column['index'] // e.g. $column['2']


Стоит иметь ввиду: 

  1. Индексы массива являются числовыми, начиная с нуля
  2. LoadColumn () эквивалентно loadColumn (0) 

 

loadColumn($index)

loadColumn($index) возвращает индексированный массив из одного столбца в таблице:

 

$query->select(array('name', 'email', 'username'));
      ->from . . .";
. . .
$db->setQuery($query);
$column= $db->loadColumn(1);
print_r($column);

 

вернет 

Array ( [0] => johnsmith @ domain.example, [1] => magda_h @ domain.example, [2] => ydg @ domain.example )

 

Вы можете получить доступ к отдельным значениям, используя:

$column['index'] // e.g. $column['2']

 

loadColumn($index) позволяет выполнять итерацию по ряду столбцов в результатах

. . .
$db->setQuery($query);
for ( $i = 0; $i <= 2; $i++ ) {
  $column= $db->loadColumn($i);
  print_r($column);
}

 

вернет: 

Array ( [0] => John Smith, [1] => Magda Hellman, [2] => Yvonne de Gaulle ),
Array ( [0] => johnsmith @ domain.example, [1] => magda_h @ domain.example, [2] => ydg @ domain.example ),
Array ( [0] => johnsmith, [1] => magdah, [2] => ydegaulle )

 

Стоит иметь ввиду:

Индексы массива являются числовыми, начиная с нуля.

 

Выборка из нескольких строк

Каждая из этих функций будет возвращать несколько записей из базы данных.

multirow

 

loadRowList()

loadRowList() возвращает индексированный массив индексированных массивов из записей таблицы, возвращаемых запросом: 

. . .
$db->setQuery($query);
$row = $db->loadRowList();
print_r($row);

 

вернет (с разрывами строк для ясности): 

Array ( 
[0] => Array ( [0] => 1, [1] => John Smith, [2] => johnsmith @ domain.example, [3] => johnsmith ), 
[1] => Array ( [0] => 2, [1] => Magda Hellman, [2] => magda_h @ domain.example, [3] => magdah ), 
[2] => Array ( [0] => 3, [1] => Yvonne de Gaulle, [2] => ydg @ domain.example, [3] => ydegaulle ) 
)

 

Вы можете получить доступ к отдельным строкам, используя: 

$row['index'] // e.g. $row['2']

 

и вы можете получить доступ к отдельным значениям, используя: 

$row['index']['index'] // e.g. $row['2']['3']

 

Стоит иметь ввиду:

Индексы массива являются числовыми, начиная с нуля.

 

loadAssocList()

loadAssocList() возвращает индексированный массив связанных массивов из записей таблицы: 

. . .
$db->setQuery($query);
$row = $db->loadAssocList();
print_r($row);

 

вернет (с разрывами строк для ясности): 

Array ( 
[0] => Array ( [id] => 1, [name] => John Smith, [email] => johnsmith @ domain.example, [username] => johnsmith ), 
[1] => Array ( [id] => 2, [name] => Magda Hellman, [email] => magda_h @ domain.example, [username] => magdah ), 
[2] => Array ( [id] => 3, [name] => Yvonne de Gaulle, [email] => ydg @ domain.example, [username] => ydegaulle ) 
) 

 

Вы можете получить доступ к отдельным строкам, используя: 

$row['index'] // e.g. $row['2']

 

и вы можете получить доступ к отдельным значениям, используя: 

$row['index']['column_name'] // e.g. $row['2']['email']

 

loadAssocList($key)

loadAssocList('key') возвращает связанный массив, индексированный по ключу, состоящий из массивов из записей таблицы: 

. . .
$db->setQuery($query);
$row = $db->loadAssocList('username');
print_r($row);

 

вернет (с разрывами строк для ясности): 

Array ( 
[johnsmith] => Array ( [id] => 1, [name] => John Smith, [email] => johnsmith @ domain.example, [username] => johnsmith ), 
[magdah] => Array ( [id] => 2, [name] => Magda Hellman, [email] => magda_h @ domain.example, [username] => magdah ), 
[ydegaulle] => Array ( [id] => 3, [name] => Yvonne de Gaulle, [email] => ydg @ domain.example, [username] => ydegaulle ) 
)

 

Вы можете получить доступ к отдельным строкам, используя: 

$row['key_value'] // e.g. $row['johnsmith']

 

и вы можете получить доступ к отдельным значениям, используя: 

$row['key_value']['column_name'] // e.g. $row['johnsmith']['email']

 

Стоит иметь ввиду:

Ключ должен быть допустимым именем столбца из таблицы; он не должен быть индексом или основным ключом. Но если он не имеет уникального значения, вы не сможете получить коррктные результаты запроса.

 

loadAssocList($key, $column)

loadAssocList('key', 'column') возвращает ассоциативный массив, индексированный по «ключу», значений из столбца с именем «column», возвращаемого запросом: 

. . .
$db->setQuery($query);
$row = $db->loadAssocList('id', 'username');
print_r($row);

  

вернет (с разрывами строк для ясности): 

Array ( 
[1] => John Smith, 
[2] => Magda Hellman, 
[3] => Yvonne de Gaulle,
)

 

Стоит иметь ввиду:

Ключ должен быть допустимым именем столбца из таблицы; он не должен быть индексом или основным ключом. Но если он не имеет уникального значения, вы не сможете получить  корректные результаты.

 

loadObjectList()

loadObjectList() Возвращает индексированный массив объектов PHP из записей таблицы, возвращаемых запросом: 

. . .
$db->setQuery($query);
$row = $db->loadObjectList();
print_r($row);

 

вернет (с разрывами строк для ясности): 

Array ( 
[0] => stdClass Object ( [id] => 1, [name] => John Smith, 
    [email] => johnsmith @ domain.example, [username] => johnsmith ), 
[1] => stdClass Object ( [id] => 2, [name] => Magda Hellman, 
    [email] => magda_h @ domain.example, [username] => magdah ), 
[2] => stdClass Object ( [id] => 3, [name] => Yvonne de Gaulle, 
    [email] => ydg @ domain.example, [username] => ydegaulle ) 
)

 

Вы можете получить доступ к отдельным строкам, используя: 

$row['index'] // e.g. $row['2']

 

и вы можете получить доступ к отдельным значениям, используя: 

$row['index']->name // e.g. $row['2']->email

 

loadObjectList($key)

loadObjectList('key') Возвращает связанный массив, индексируемый по ключу, объектов из записей таблицы, возвращаемых запросом: 

. . .
$db->setQuery($query);
$row = $db->loadObjectList('username');
print_r($row);

 

вернет (с разрывами строк для ясности): 

Array ( 
[johnsmith] => stdClass Object ( [id] => 1, [name] => John Smith, 
    [email] => johnsmith @ domain.example, [username] => johnsmith ), 
[magdah] => stdClass Object ( [id] => 2, [name] => Magda Hellman, 
    [email] => magda_h @ domain.example, [username] => magdah ), 
[ydegaulle] => stdClass Object ( [id] => 3, [name] => Yvonne de Gaulle, 
    [email] => ydg @ domain.example, [username] => ydegaulle ) 
)

 

Вы можете получить доступ к отдельным строкам, используя: 

$row['key_value'] // e.g. $row['johnsmith']

  

и вы можете получить доступ к отдельным значениям, используя: 

$row['key_value']->column_name // e.g. $row['johnsmith']->email

 

Стоит иметь ввиду:

Ключ должен быть допустимым именем столбца из таблицы; он не должен быть индексом или основным ключом. Но если он не имеет уникального значения, вы не сможете получить корректные результаты.

 

Различные методы набора результатов

getNumRows()

getNumRows() вернет количество строк результатов, найденных последним запросом SELECT или SHOW. Чтобы получить результат от getNumRows (), вам нужно запустить его после запроса и до того, как вы получите какие-либо результаты. Чтобы получить количество строк, на которые влияет запрос INSERT, UPDATE, REPLACE или DELETE, используйте getAffectedRows().

 

. . .
$db->setQuery($query);
$db->execute();
$num_rows = $db->getNumRows();
print_r($num_rows);
$result = $db->loadRowList();

 

вернет 

3

 

Стоит иметь ввиду:

getNumRows () действителен только для таких операторов, как SELECT или SHOW, которые возвращают фактический набор результатов. Если вы запустите getNumRows () после loadRowList () или любого другого метода извлечения, вы получите предупреждение PHP:  

Warning: mysql_num_rows(): 80 is not a valid MySQL result resource 
in libraries\joomla\database\database\mysql.php on line 344

 

 Оригинал статьи