3281  1

#joomla[faq] :: как корректно получить данные (select) из базы данных

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

#joomla[faq] :: как корректно получить данные (select) из базы данных

Официальная документация по работе с базой данных находится здесь. Но… Как показывает опыт, можно, и на мой взгляд даже нужно, применять более короткую запись в запросах типа SELECT в базе данных CMS Joomla!.

loadResult()

Итак. Официальный алгоритм простого запроса loadResult() к БД выглядит следующим образом.

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

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

В этом запросе мы получаем имя пользователя name из таблицы:

id name email username
1 John Smith Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. johnsmith
2 Magda Hellman Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. magdah
3 Yvonne de Gaulle Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. ydegaulle

Это же значение можно получить используя более короткую, и, на мой взгляд, более логичную, запись (где переменная $some_value = 1):

$db = JFactory::getDbo();
$db->setQuery('SELECT name FROM #__my_table WHERE id = ' . $some_value);
$valueStr = $db->loadResult();

В результате получаем в переменную $valueStr значение соответствующей ячейки таблицы John Smith.

loadRow()

Для получения в массиве целой строки из таблицы используем запрос loadRow().

id name email username
1 John Smith Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. johnsmith
2 Magda Hellman Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. magdah
3 Yvonne de Gaulle Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. ydegaulle

$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id = ' . $some_value);
$valueArr = $db->loadRow();

В результате в переменную $valueArr получаем массив в виде:

Array ([0]=>1, [1]=>John Smith, [2]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [3]=>johnsmith)

Используя запрос:

$value = $valueArr[0];

…получаем id строки записи. Далее меняя вместо "0" ключи массива, получаем те значения строки таблицы, которые нам нужны.

loadAssoc()

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

$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id = ' . $some_value);
$valueArr = $db->loadAssoc();

…получаем ассоциативный массив в виде:

Array ([id]=>1, [name]=>John Smith, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>johnsmith)

Соответственно, чтобы получить, например, email пользователя, нужно обратиться к ассоциативному массиву в переменной $valueArr с ключом email:

$value = $valueArr['email'];

loadObject()

Также данные строки из таблицы базы данных в CMS Joomla! можно получить в виде объекта, и работать в дальнейшем с этими данными соответствующим способом.

$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id = ' . $some_value);
$valueArr = $db->loadObject();

В результате выполнения такого запроса, мы получаем объект, который содержит следующие данные:

stdClass Object ([id]=>1, [name]=>John Smith, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>johnsmith)

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

$value = $valueArr->username;

loadColumn()

id name email username
1 John Smith Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. johnsmith
2 Magda Hellman Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. magdah
3 Yvonne de Gaulle Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. ydegaulle

Используя запрос к БД в виде:

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT name FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadColumn();

…мы получаем в массиве данные из колонки name, где id строк соответствуют значениям "1", "2" и "3".

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

loadRowList()

Чтобы иметь возможность оперировать данными сразу из многих колонок таблицы, применяем запрос loadRowList().

id name email username
1 John Smith Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. johnsmith
2 Magda Hellman Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. magdah
3 Yvonne de Gaulle Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. ydegaulle

В виде кода PHP запрос может выглядеть следующим образом:

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadRowList();

В результате получаем массивы в массиве:

Array (
[0]=>Array ([0]=>1, [1]=>John Smith, [2]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [3]=>johnsmith),
[1]=>Array ([0]=>2, [1]=>Magda Hellman, [2]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [3]=>magdah),
[2]=>Array ([0]=>3, [1]=>Yvonne de Gaulle, [2]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [3]=>ydegaulle)
)

Соответственно, чтобы получить определенную запись из определенной ячейки, нужно использовать код следующего типа:

$value = $valueArr[2][3];

Таким образом, мы получаем значение логина пользователя (username) из третьей строки (счёт в массиве начинается с ноля), и четвёртого столбца, что в нашем случае, соответствует значению ydegaulle.

loadAssocList()

Но… В большинстве случаев подобный вид массива сложно использовать в практических целях, поэтому, существует ещё один метод получения данных из БД CMS Joomla! уже в виде ассоциативного массива, где ключами массива являются названия полей таблицы. Например:

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadAssocList();

В этом случае мы получаем уже ассоциативный массив в виде:

Array (
[0]=>Array ([id]=>1, [name]=>John Smith, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>johnsmith),
[1]=>Array ([id]=>2, [name]=>Magda Hellman, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>magdah),
[2]=>Array ([id]=>3, [name]=>Yvonne de Gaulle, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>ydegaulle)
)

Этот вид массива удобно применять, в частности, в цикле for, когда нам в одном месте нужно использовать одно значение в зависимости от другого значения из той же таблицы. Например, для получения записи имени пользователя в цикле "$i = 1", мы используем код:

$i = 1;
	
$value = $valueArr[$i]['name'];

В результате получаем Magda Hellman.

loadAssocList($key)

В большинстве же случаев наиболее удобно использовать данные массива в привязке к определённому уникальному ключу. Например, id пользователя, статьи, email пользователя и т.д. Для подобных случаев в системе управления контентом (CMS) Joomla! существует ещё один способ формирования ассоциативного массива из нескольких столбцов одной таблицы базы данных – loadAssocList($key). В качестве примера в нижеприведенном коде мы используем привязку к уникальному ключу id пользователя.

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadAssocList('id');

В результате получаем массив:

Array (
[1]=>Array ([id]=>1, [name]=>John Smith, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>johnsmith),
[2]=>Array ([id]=>2, [name]=>Magda Hellman, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>magdah),
[3]=>Array ([id]=>3, [name]=>Yvonne de Gaulle, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>ydegaulle)
)

loadAssocList($key, $column)

Часто бывает нужно, избежав лишних данных в переменной, получить связанные значение из массива. Таким образом, переменной $key присваиваем значение уникального ключа, и в качестве переменной $column указываем имя поля, которое будет представлено в связке с соответствующим ключом.

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadAssocList($id, $name);

…в результате получаем в переменной массив:

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

…где ключами массива являются id строки, а значением – имя пользователя (name).

loadObjectList()

В качестве альтернативы простому ассоциативному массиву CMS Joomla! предлагает ещё один формат данных, в виде объекта, который пользователь может получать из базы данных и использовать в своих скриптах.

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadObjectList();

В результате получаем массив из объектов в виде:

Array (
[0]=>stdClass Object ([id]=>1, [name]=>John Smith, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>johnsmith),
[1]=>stdClass Object ([id]=>2, [name]=>Magda Hellman, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>magdah),
[2]=>stdClass Object ([id]=>3, [name]=>Yvonne de Gaulle, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>ydegaulle)
)

В этом случае, чтобы получить значение из определённой ячейки какой-либо строки, нужно применить код такого типа:

$value = $valueArr[1]->username;

…который нам возвращает логин пользователя из вышеприведенной таблицы используя строку с ключом "1" и ключом вложенного массива "username". В данном конкретном случае, данный код нам возвращает значение magdah.

Ну и напоследок…

loadObjectList($key)

Аналог loadObjectList(), но уже в качестве ассоциативного массива объектов с ключом по одному из полей с уникальними значениями. Например:

$some_value = '1,2,3';
	
$db = JFactory::getDbo();
$db->setQuery('SELECT * FROM #__my_table WHERE id IN (' . $some_value . ')');
$valueArr = $db->loadObjectList('username');

В данном случае мы получаем асоциативный массив из объектов со следующим содержимым:

Array (
[johnsmith]=>stdClass Object ([id]=>1, [name]=>John Smith, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>johnsmith),
[magdah]=>stdClass Object ([id]=>2, [name]=>Magda Hellman, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>magdah),
[ydegaulle]=>stdClass Object ([id]=>3, [name]=>Yvonne de Gaulle, [email]=>Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript., [username]=>ydegaulle)
)

Чтобы получить, например, имя пользователя, используя его логин, можно использовать следующий код:

$value = $valueArr['johnsmith']->name;

В результате получаем значение переменной $value = John Smith.

Если вам понравилась эта статья – комментируйте, делитесь в социальных сетях (кнопки «Поделиться» слева страницы).

Удачи, Мира и Добра!

Если вы уже зарегистрированы на этом сайте, или уже оставляли здесь свои комментарии, отзывы, заявки на участие в акциях, чтобы добавить ещё один комментарий – авторизуйтесь

Добавить комментарий

Комментарии


«ArtInWeb.biz»
  • #26

UA :: У коментарях ви можете щось додати або уточнити, у т.ч. поділитися вашим кодом.


RU :: В комментариях вы можете что-то добавить или уточнить, в т.ч. поделиться вашим кодом.


EN :: In comments you can add or clarify something, including share your code.


© «ArtInWeb.biz» – веб-разработка полного цикла

Последний раз редактировалось: 03/04/2020