Менеджер коллекции
Это специальный класс для работы с коллекциями объектов. У класса есть собственные методы, а также доступны методы класса xPDOQuery.
Собственные методы
all($name|callable)
- получает массив всех объектов сформированного запроса. Если указано название свойства или callback функция, то выведет массив значений этого свойства или значение функции. Callback функция принимает один параметр - коллекцию массивов.
// Коллекция ресурсов в шаблоном 5 $resources = collection('modResource')->where(['template'=>5])->all(); // Коллекция массивов ресурсов return resources()->innerJoin('modTemplate', 'Template')->select('modResource.*, Template.templatename')->toArray(true);
get($name|callable)
- получает массив объектов сформированного запроса. Если указано название свойства, то выведет массив значений этого свойства. Можно указать callback функцию. Она принимает 2 аргумента - $collection
и $modx
По-умолчанию выводит 100 записей. Изменить это количество можно методом limit()
. Для получения всех записей используйте метод all()
. // Использование callback функции return resources() ->where(['id:IN'=>children(5)]) ->get(function($collection, $modx){ $output = '<ul>'; foreach($collection as $item) { $output .= '<li>' . $item['pagetitle'] ."</li>"; } return $output . '</ul>'; });
each(callable)
- перебирает каждый элемент коллекции и вызывает для него callback функцию. В качестве параметров функция принимает массив объекта, номер итерации и объект $modx. Чтобы остановить итерацию, нужно вернуть false
. // Получение списка с заголовками с использованием callback функции. return resources()->where(['id:IN'=>children(5)])->each(function($resource, $idx){ return "<li>{$idx}. ".$resource['pagetitle']."</li>";}); // Остановка перебора на 10-й итерации. return resources()->where(['id:IN'=>children(5)])->each(function($resource, $idx){ if ($idx == 10) { return false; } else { return "<li>{$idx}. ".$resource['pagetitle']."</li>"; } });
alias($alias)
- присваивает псевдоним таблице запроса. Альтернатива методу setClassAlias()
. resources()->alias('Doc')->toSql(); //SELECT `Doc`.`id`, `Doc`.`type`, `Doc`.`contentType`, ... FROM `modx_site_content` AS `Doc` LIMIT 100
from($table, $alias)
- добавляет таблицу в запрос. В качестве таблицы можно указать запрос SELECT. // Список пользователей мужского пола $mans = collection('modUser')->from(table_name('modUserProfile'),'Profile')->where('modUser.id = Profile.internalKey AND Profile.gender = 1')->get();
union($query)
- добавляет данные к запросу. В качестве параметра может быть указан SQL запрос или массив с данными. Используется только для массивов. Можно использовать несколько раз.// Получение массива заголовков дочерних элементов ресурса 5 и использование UNION. $array = resources() ->where(['id:IN'=>children(5)]) ->union('select pagetitle from ' . table_name('modResource') . ' WHERE id = 1') ->union(['pagetitle'=>'New pagetitle']) ->get('pagetitle');
first($number)
- выводит указанное количество первых объектов.last($number)
- выводит указанное количество последних объектов.toArray($toString)
- выводит объекты ввиде массива. Если в качестве аргумента передать true
, то выведет строку, полученную с помощью фукнции print_r
.toSql()
- выводит сформированный SQL запрос. Полезно для отладки.set($data|callable)
- обновляет данные запроса. Аргументом должен быть массив с данными или callback функция, которая возвращает массив. Callback функция принимает аргументами объект коллекции и объект modX. Возвращает количество изменённых строк или false
в случае ошибки запроса. Замыкает цепочку методов.// Переместить ресурсы от одного родителя другому и указать другой шаблон if (!collection('modResource')->where(['parent'=>20])->set(['parent'=>5,'template'=>1])) { // Сбой операции } // Обновляем pagetitle у дочерних элементов категории 10. return resources() ->where(['id:IN'=>children(10)]) ->set(function($object, $modx) { if ($object->pagetitle == 'Первый документ') return false; // пропускаем итерацию $object->pagetitle = $object->pagetitle . ' new'; // изменяем заголовок });
Вариант с callback функцией более гибкий, но и более медленный. Так как для каждого элемента коллекции создается объект, а затем изменения сохраняются в базе данных. Т.е. для каждого объекта используется как минимум 2 запроса к БД. В случае с массивом используется всего 1 запрос для обновления всех элементов сразу.
Этот метод требует права save
.
remove()
- удаляет записи согласно условию. Возвращает количество изменённых строк или false
в случае ошибки запроса. Замыкает цепочку методов. Используйте с осторожностью! // Удалить ресурсы родителя с id = 20 collection('modResource')->where(['parent'=>20])->remove();
Этот метод требует права remove
.
withTV($TVname, $prefix)
- подключает к выборке указанную первым параметром ТВшку. Вторым параметром указывается префикс. По-умолчанию, это "TV.". Можно использовать столько раз, сколько нужно подключить TV.// Подключение TV $count = collection('modResource')->withTV('myTv')->where(['TV.myTv'=>100])->get();
where()
- добавляет условие WHERE в запрос через союз AND. orWhere()
- добавляет условие WHERE через союз OR. collection('modResource')->select('id')->where(['parent'=>5])->orWhere(['template'=>1])->toSql(); // SELECT `id` FROM `modx_site_content` AS `modResource` WHERE ( `modResource`.`parent` = 5 OR `modResource`.`template` = 1 ) LIMIT 100
whereExists($tableName, $where, $conjunction = 'AND')
- добавляет условие EXISTS. Первый параметр - название таблицы. Чтобы указать псевдоним, используйте массив - array('tableName'=>'alias')
. Второй параметр - условие для WHERE. Третий параметр - тип условия: "AND" или "OR".collection('modResource')->whereExists(['modx_mytable'=>'T'],'modResource.id = T.id AND T.name = "Самсунг"')->get(); // SELECT * FROM `modResource` as `modResource` WHERE EXISTS (SELECT 1 FROM `modx_mytable` as `T` WHERE modResource.id = T.id AND T.name = "Самсунг")
whereNotExists($tableName, $where, $conjunction = 'AND')
- добавляет условие NOT EXISTS. Первый параметр - название таблицы. Чтобы указать псевдоним, используйте массив - array('tableName'=>'alias')
.whereIn($column, $array, $conjunction = 'AND')
- добавляет условие IN. Первый параметр - название колонки. Второй параметр - массив значений. Третий параметр - тип условия: "AND" или "OR".whereNotIn($column, $array, $conjunction = 'AND')
- добавляет условие NOT IN. Первый параметр - название колонки. Второй параметр - массив значений. Третий параметр - тип условия: "AND" или "OR".whereLike($column, $value, $conjunction = 'AND')
- добавляет условие LIKE. Первый параметр - название колонки. Второй параметр - значение для сравнения. Третий параметр - тип условия: "AND" или "OR".whereNotLike($column, $value, $conjunction = 'AND')
- добавляет условие NOT LIKE. Первый параметр - название колонки. Второй параметр - значение для сравнения. Третий параметр - тип условия: "AND" или "OR".whereIsNull($column, $conjunction = 'AND')
- добавляет условие IS NULL. Первый параметр - название колонки. Второй параметр - тип условия: "AND" или "OR".whereNotLike($column, $conjunction = 'AND')
- добавляет условие IS NOT NULL. Первый параметр - название колонки. Второй параметр - тип условия: "AND" или "OR".count($column)
- выводит количество записи согласно условию. // Вывести количество ресурсов $count = collection('modResource')->where(['parent'=>5])->count();
max($column)
- выводит максимальное значение указанной колонки. //Выводит последнее значение id $lastID = resources()->max('id');
min($column)
- выводит минимальное значение указанной колонки. sum($column)
- выводит сумму значений указанной колонки. avg($column)
- выводит среднее значение указанной колонки. members($group)
- ограничивает запрос по указанной группе. В качестве аргумента можно указать id группы или её название. Причем можно использовать маски оператора LIKE
(% и _). Внимание!
Используется только для класса modUser
.
$usersArray = users()->members(1)->toArray(); $usersArray = users()->members('Managers')->toArray(); // Выведет пользователей групп "ContentManager" и "SaleManager" $usersArray = users()->members('%Managers')->toArray();
joinGroup($groupId, $roleId = null, $rank = null)
- добавляет объекты (пользователей/ресурсы) в указанную группу. - $groupId - id или название группы.
- $roleId - id или название роли. Для объектов-пользователей.
- $rank - ранг пользователя. Для объектов-пользователей.
// Добавим первых 10 пользователей в группу Manager users()->whereIn('id',range(1,10))->joinGroup('Manager'); // Добавим ресурсы в группу ресурсов resources()->where(['parent'=>10])->joinGroup('forMembers');
leaveGroup($groupId)
- удаляет объекты (пользователей/ресурсы) из указанной группы.