Почему не срабатывает select на modResource?

В консоле пишу код
<?php
$c = $modx->newQuery('modResource');
$c->select('`modResource`.`id`,`modResource`.`pagetitle`');

$c->prepare(); echo $c->toSQL();

$data = $modx->getCollection('modResource',$c);
foreach($data as $v){
    echo "<pre>".print_r($v->toArray(),1)."</pre>";
}
Получаю вывод
SELECT `modResource`.`id`, `modResource`.`pagetitle` FROM `modx_site_content` AS `modResource`
Array
(
    [id] => 1
    [type] => 0
    [contentType] => text/html
    [pagetitle] => Главная
    [longtitle] => Поздравляем!
    [description] => 
    [alias] => index
    [alias_visible] => 1
    [link_attributes] => 
    [published] => 1
    [pub_date] => 0
...
В запросе написано получать только id и pagetitle. В SQL только id и pagetitle. Откуда в результатах все поля modResource?
Александр Туниеков
19 сентября 2019, 23:27
modx.pro
603
0
Поблагодарить автора Отправить деньги

Комментарии: 2

Сергей Шлоков
20 сентября 2019, 06:37
+1
Потому что ты запрашиваешь объекты. И тебе выводятся поля из объекта.

Для понимания. Если ты создашь новый пустой объект и выведешь его
$resource = new modResource(...);
$resource->toArray();
то тоже получишь все поля, но пустые.

В твоём случае, ты инициализируешь указанные в select поля объектов данными из базы. Остальные поля — так называемые lazy. Они инициализируются из кэша. Если кэша нет, то делается запрос в базу и сохраняется в кэш.
Если нужно получить массив данных (что предпочтительней), то лучше делать так
$resources = [];
if ($c->prepare() && $c->stmt->execute()) {
    $resources = $c->stmt->fetchAll(PDO::FETCH_ASSOC);
}
foreach($resources as $resource){
    echo "<pre>".print_r($resource, true)."</pre>";
}
В этом случае получишь то, что запрашивал. И памяти меньше кушает.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2