public function childrenWithTranslations($node = null, $locale = null, $direct = false, $sortByField = null, $direction = 'ASC', $includeNode = false, $start = null, $limit = null)
{
$meta = $this->getClassMetadata();
$config = $this->listener->getConfiguration($this->_em, $meta->name);
$qb = $this->getQueryBuilder();
$qb->select('node', 't')->from($config['useObjectClass'], 'node')->leftJoin('node.translations', 't');
if ($node !== null) {
if ($node instanceof $meta->name) {
$wrapped = new EntityWrapper($node, $this->_em);
if (!$wrapped->hasValidIdentifier()) {
throw new InvalidArgumentException('Node is not managed by UnitOfWork');
}
if ($direct) {
$id = $wrapped->getIdentifier();
$qb->where($id === null ? $qb->expr()->isNull('node.' . $config['parent']) : $qb->expr()->eq('node.' . $config['parent'], is_string($id) ? $qb->expr()->literal($id) : $id));
} else {
$left = $wrapped->getPropertyValue($config['left']);
$right = $wrapped->getPropertyValue($config['right']);
if ($left && $right) {
$qb->where($qb->expr()->lt('node.' . $config['right'], $right))->andWhere($qb->expr()->gt('node.' . $config['left'], $left));
}
}
if (isset($config['root'])) {
$rootId = $wrapped->getPropertyValue($config['root']);
$qb->andWhere($rootId === null ? $qb->expr()->isNull('node.' . $config['root']) : $qb->expr()->eq('node.' . $config['root'], is_string($rootId) ? $qb->expr()->literal($rootId) : $rootId));
}
if ($includeNode) {
$idField = $meta->getSingleIdentifierFieldName();
$qb->where('(' . $qb->getDqlPart('where') . ') OR node.' . $idField . ' = :rootNode');
$qb->setParameter('rootNode', $node);
}
} else {
throw new \InvalidArgumentException('Node is not related to this repository');
}
} else {
if ($direct) {
$qb->where($qb->expr()->isNull('node.' . $config['parent']));
}
}
if (!$sortByField) {
$qb->orderBy('node.' . $config['left'], 'ASC');
} elseif (is_array($sortByField)) {
$fields = '';
foreach ($sortByField as $field) {
$fields .= 'node.' . $field . ',';
}
$fields = rtrim($fields, ',');
$qb->orderBy($fields, $direction);
} else {
if ($meta->hasField($sortByField) && in_array(strtolower($direction), array('asc', 'desc'))) {
$qb->orderBy('node.' . $sortByField, $direction);
} else {
throw new InvalidArgumentException("Invalid sort options specified: field - {$sortByField}, direction - {$direction}");
}
}
if ($start) {
$qb->setFirstResult($start);
}
if ($limit) {
$qb->setMaxResults($limit);
}
return $this->setTranslatableHint($qb->getQuery(), $locale);
}