Doctrine PHPCR-ODM Query Builder выбирает документ внутри определенного узла

У меня есть следующие узлы:

/
/applications
/applications/1
/applications/1/pages [contains Page documents]

Я хочу выбрать все Page документы внутри узла /applications/1. Я использовал для этого следующее (что кажется правильным), но выдает ошибку:

$qb = $this->dm->createQueryBuilder();
$qb->from()->document('Mango\CoreDomainBundle\Document\Page', 'page');

// I want to select the pages which are a child of /applications/1
$qb->where()->child('/applications/1', 'application');

$qb->getQuery()->execute();

Когда я выполняю это, он выдает следующую ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'n1.id' in 'field list'

Это SQL-запрос, который отправляется обратно в базу данных:

SELECT 
    n0.id AS n0_id,
    n0.path AS n0_path,
    n0.parent AS n0_parent,
    n0.local_name AS n0_local_name,
    n0.namespace AS n0_namespace,
    n0.workspace_name AS n0_workspace_name,
    n0.identifier AS n0_identifier,
    n0.type AS n0_type,
    n0.props AS n0_props,
    n0.depth AS n0_depth,
    n0.sort_order AS n0_sort_order,
    n1.id AS n1_id,
    n1.path AS n1_path,
    n1.parent AS n1_parent,
    n1.local_name AS n1_local_name,
    n1.namespace AS n1_namespace,
    n1.workspace_name AS n1_workspace_name,
    n1.identifier AS n1_identifier,
    n1.type AS n1_type,
    n1.props AS n1_props,
    n1.depth AS n1_depth,
    n1.sort_order AS n1_sort_order
FROM
    phpcr_nodes n0
WHERE
    n0.workspace_name = 'mango'
        AND n0.type IN ('nt:unstructured' , 'rep:root')
        AND (n1.parent = 'applications/1'
        AND (EXTRACTVALUE(n0.props,
            'count(//sv:property[@sv:name="phpcr:class"]/sv:value[text()="Mango\CoreDomainBundle\Document\Page"]) > 0')
        OR EXTRACTVALUE(n0.props,
            'count(//sv:property[@sv:name="phpcr:classparents"]/sv:value[text()="Mango\CoreDomainBundle\Document\Page"]) > 0')))

Я надеюсь, что кто-нибудь может мне помочь! Спасибо!


person Steffen Brem    schedule 01.05.2014    source источник
comment
это похоже на ошибку, о которой уже сообщалось: github.com/doctrine/phpcr-odm /вопросы/487   -  person dbu    schedule 03.05.2014


Ответы (1)


Хм, похоже, я был просто тупым :P Псевдоним, используемый в качестве второго аргумента дочернего условия, должен быть псевдонимом документа, для которого вы запускаете построитель запросов.

Неправильно:

$qb = $this->dm->getRepository('Mango\CoreDomainBundle\Document\Page')
    ->createQueryBuilder('page');
$qb->where()->child('/applications/456', 'alias_1');

Хорошо

$qb = $this->dm->getRepository('Mango\CoreDomainBundle\Document\Page')
    ->createQueryBuilder('page');
$qb->where()->child('/applications/456', 'page');

Кроме того, в моем случае мне пришлось использовать descendant, а не child. См. http://docs.doctrine-project.org/projects/doctrine-phpcr-odm/en/latest/reference/query-builder-reference.html#descendant

Тему можно закрывать :)

person Steffen Brem    schedule 04.05.2014