Почему не срабатывает 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?
Поблагодарить автора
Отправить деньги
Комментарии: 2
Потому что ты запрашиваешь объекты. И тебе выводятся поля из объекта.
Для понимания. Если ты создашь новый пустой объект и выведешь его
В твоём случае, ты инициализируешь указанные в select поля объектов данными из базы. Остальные поля — так называемые lazy. Они инициализируются из кэша. Если кэша нет, то делается запрос в базу и сохраняется в кэш.
Если нужно получить массив данных (что предпочтительней), то лучше делать так
Для понимания. Если ты создашь новый пустой объект и выведешь его
$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>";
}
В этом случае получишь то, что запрашивал. И памяти меньше кушает.
Понятно. Что-то это оказалось мне неожиданно :-(.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.