Менеджер коллекции

Это специальный класс для работы с коллекциями объектов. У класса есть собственные методы, а также доступны методы класса 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) - удаляет объекты (пользователей/ресурсы) из указанной группы.
Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.