public function getValue($params = [], $processCallbacks = true)
    {
        if ($this->isNull($this->value)) {
            // We need to load records from DB - but ONLY if parent record has an ID (otherwise no child records can exist in DB)
            $entityId = $this->parent->id;
            if (empty($entityId)) {
                // No child records exist - return an empty EntityCollection
                $this->value = new EntityCollection($this->entityClass, []);
                $this->dataLoaded = true;
            } else {
                // Try loading child records using parent id
                $query = [$this->relatedAttribute => $entityId];

                // Get optional record filters
                $filters = $this->filter;
                if (is_string($filters) || is_callable($filters)) {
                    $callable = is_string($filters) ? [$this->parent, $filters] : $filters;
                    $filters = call_user_func_array($callable, []);
                }

                // Merge optional filters with main query
                $query = array_merge($query, $filters);
                $this->value = call_user_func_array([$this->entityClass, 'find'], [$query, $this->sorter]);
                $this->dataLoaded = true;
            }
        }

        return $processCallbacks ? $this->processGetValue($this->value, $params) : $this->value;
    }