Подскажите, как сделать запрос к базе данных

Аватар пользователя Alex554 Alex554 21 января в 12:14

Столько перерыл, совсем не могу понять, пожалуйста подскажите.
Делаю запрос к базе данных на Drupal 8.9.12
Получаю:
Array
(
[0] => stdClass Object
(
[__CLASS__] => stdClass
)

[1] => stdClass Object
(
[__CLASS__] => stdClass
)

[2] => stdClass Object
(
[__CLASS__] => stdClass
)
$messages = $query->execute()->fetchAll();

Что дальше с этим делать?
Как получить сами данные?
Пожалуйста, подскажите, столько перерыл, но так и не нашел.

Комментарии

Аватар пользователя Alex554 Alex554 21 января в 12:38

Да все что угодно, мне просто понять как в новом для меня Друпале (я работал на 6ке и 7ке) сделать запрос и получить поля.
Я вот что делаю:
$query = Database::getConnection()->select('watchdog', 'w');
$query->fields('w', ['message']);
$query->condition('w.type', 'cron');
$messages = $query->execute()->fetchAll();
dpm($messages);

Аватар пользователя ivnish ivnish 21 января в 12:39

Alex554 wrote: Да все что угодно,

Для работы с сущностями в Д8/9 есть специальные сервисы. Необходимости вручную лезть в базу особо и нет

Аватар пользователя Alex554 Alex554 21 января в 12:40

Пожалуйста, подскажите что за сервисы, где почитать?
Мне нужно сделать несколько своих модулей со своими таблицами.

Аватар пользователя Alex554 Alex554 21 января в 12:46

Так я по этой статье и делаю, но получаю что писал выше.
В данный момент у меня задача следующая: вывести поля формы и что в них вводится добавить в базу.
Я вывел их в файле namespace Drupal\my_module\Form
И в функции public function buildForm(array $form, FormStateInterface $form_state) {
пытаюсь получить введеные строки из базы

Аватар пользователя Alex554 Alex554 21 января в 12:48

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

Аватар пользователя Alex554 Alex554 21 января в 13:45

Просто в последней строке сделал это:
$output = $query->execute()->fetchAssoc();
И все заработало

Аватар пользователя Alex554 Alex554 21 января в 13:54

Даже пошлый способ работает:
$result = db_query('SELECT * FROM {my_module} ORDER BY id')->fetchAssoc();
dpm($result);

Аватар пользователя Alex554 Alex554 21 января в 17:09

Почему запрос:
$query = db_query("SELECT * FROM {node}");
$output = $query->fetchAll();
return $output;
Выдает:
Array
(
[0] => stdClass Object
(
[__CLASS__] => stdClass
)

[1] => stdClass Object
(
[__CLASS__] => stdClass
)

)
Как сами данные то получить?

Аватар пользователя charOFF charOFF 21 января в 18:03

Потому что по-умолчанию данные возвращаются в виде массива объектов, т.к. используется PDO::FETCH_OBJ стиль выборки. Подробнее можно почитать здесь https://www.php.net/manual/ru/pdostatement.fetch.php#refsect1-pdostateme...
Соответственно каждая строка представлена объектом, свойства которого соответствуют полям в выборке.
И чтобы обойти значения, не обязательно делать fetchAll(), можно сразу в цикле обходить результат, как-то так:

<?php

$result 

$query->execute();
foreach (
$result as $row) {
  
dpm($row->message);
}

?>

Если в выборке есть поле `message`

Аватар пользователя OldWarrior OldWarrior 21 января в 19:03
2

Alex554 wrote: Почему запрос ... Выдает ... [0] => stdClass Object ...

Дык энто... А что он должен выдавать вместо этого?
Налицо неспособность сформулировать проблему.

- Почему запрос?
- Что "почему запрос"?
- Ну почему запрос?
- Да что "почему запрос"?!
- Да неужели никто почему запрос?
- ... ?

Аватар пользователя Alex554 Alex554 22 января в 10:42

Спасибо за гениальную помощч, но мне уже подсказали, менее гениальные люди!

Аватар пользователя OldWarrior OldWarrior 23 января в 6:53

Вот вы лучше этим людям трижды в пояс поклонитесь, чем ерничать. Потому что не каждый будет даже читать подобную феерию, а не то чтобы отвечать. И (простите) как-то с трудом верится, что (цитата) "Столько перерыл", поскольку PHP Data Objects (а-ля PDO-стиль выборки) используется как минимум с 7-й ветки, да и в целом информации по обработке рядов результата SQL-выборки в Сети - валом.