private function getIdsQuery($depth = 0, $filter = [], $sortBy = [], CollectionInterface $collection = null, $select = 'collection.id')
{
$queryBuilder = $this->createQueryBuilder('collection')->select($select)->where('collection.depth <= :depth');
$collectionDepth = $collection !== null ? $collection->getDepth() : 0;
$queryBuilder->setParameter('depth', $collectionDepth + $depth);
if ($collection !== null) {
$queryBuilder->andWhere('collection.lft BETWEEN :lft AND :rgt AND collection.id != :id');
$queryBuilder->setParameter('lft', $collection->getLft());
$queryBuilder->setParameter('rgt', $collection->getRgt());
$queryBuilder->setParameter('id', $collection->getId());
}
if (array_key_exists('search', $filter) && $filter['search'] !== null || array_key_exists('locale', $filter) || count($sortBy) > 0) {
$queryBuilder->leftJoin('collection.meta', 'collectionMeta');
$queryBuilder->leftJoin('collection.defaultMeta', 'defaultMeta');
}
if (array_key_exists('search', $filter) && $filter['search'] !== null) {
$queryBuilder->andWhere('collectionMeta.title LIKE :search OR defaultMeta.locale != :locale');
$queryBuilder->setParameter('search', '%' . $filter['search'] . '%');
}
if (array_key_exists('locale', $filter)) {
$queryBuilder->andWhere('collectionMeta.locale = :locale OR defaultMeta.locale != :locale');
$queryBuilder->setParameter('locale', $filter['locale']);
}
if (array_key_exists('systemCollections', $filter) && !$filter['systemCollections']) {
$queryBuilder->leftJoin('collection.type', 'collectionType');
$queryBuilder->andWhere('collectionType.key != :type');
$queryBuilder->setParameter('type', SystemCollectionManagerInterface::COLLECTION_TYPE);
}
if (count($sortBy) > 0) {
foreach ($sortBy as $column => $order) {
$queryBuilder->addOrderBy('collectionMeta.' . $column, strtolower($order) === 'asc' ? 'ASC' : 'DESC');
}
}
$queryBuilder->addOrderBy('collection.id', 'ASC');
if (array_key_exists('limit', $filter)) {
$queryBuilder->setMaxResults($filter['limit']);
}
if (array_key_exists('offset', $filter)) {
$queryBuilder->setFirstResult($filter['offset']);
}
return $queryBuilder->getQuery();
}