ManyToMany => get all, with(out) relations

Hello, everybody.

I have a ManyToMany relationship: order to delivery (an order can have several deliveries and vice versa). I’m using Neows Flow 6.0.8.

First I want to find all orders that have no delivery. This is the easiest part:

`$query->isEmpty(‘shippings’);

Now, I wand to find all orders hat have min. one delivery. My guess:

$query->logicalNot($query->isEmpty(‘shippings’));

But then I get the message: “Expected parameter of type “object”, “bool” provided”

Any idea how to solve this problem? Thank you!

Tobias

Hi Tob :slight_smile:

Can you show us the full repository method? I believe you are on the right track :slight_smile:

Dear Soren,

thanks a lot for your prompt reply.
My full method in OrderRepository.php:

public function getShippedOrders() {
    $query = $this->createQuery();
    return $query->matching(
        $query->logicalNot($query->isEmpty('shippings'))
    )->execute();
}

I hope I just got a little mistake in thinking :slight_smile: Thank you again for your help.

Tobias

Dear Soren,

do you have an idea, how I can solve that issue? Or can someone confirm, that a negation of an “isEmpty” is not possible? :thinking:

Thank you!

Tobias

Try

$query->matching($query->logicalNot($query->equals('shippings', null)))

So you tell the ORM layer to give you all where the shippings relation is not null (empty)

Hi Soren,

thank you very much for your efforts. This was my very first approach, to achieve the result, but unfortunately this is not working. No error is generated, but the result is always empty.

I have the feeling, there is currently no way, to create this query without using DQL.

@TobMei
Enable the sql logger in Settings.yaml (look inside `Development/Settings.yaml for the setting) and see what sql is generated.

It’s done before, I know I’ve done it with the method I just posted. Look that it doesn’t use isEmpty but looks for if the property is equal null

You give me new hope :smiley:

I tried your suggestion again and printed the related DQL string with the help of QueryBuilder:

SELECT e FROM Your\Package\Domain\Model\Order e WHERE NOT(e.shippings IS NULL)

Is this a valid DQL string? If so, I will try to get the SQL Logger running…

I’m sorry, I told you, there is no error - but I found a “silent” exception.
Here is the exception, which is thrown:

Exception in line 492 of /var/www/public/Packages/Libraries/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php: [Semantical Error] line 0, col 57 near ‘shippings IS’: Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.

92 Doctrine\ORM\Query\QueryException::semanticalError(“line 0, col 57 near ‘shippings IS’: Error: Invalid…pression or SingleValuedAssociationField expected.”, Doctrine\ORM\Query\QueryException)
91 Doctrine\ORM\Query\Parser::semanticalError(“line 0, col 57 near ‘shippings IS’: Error: Invalid…pression or SingleValuedAssociationField expected.”, array|3|)
90 Doctrine\ORM\Query\Parser::processDeferredPathExpressions()
89 Doctrine\ORM\Query\Parser::getAST()
88 Doctrine\ORM\Query\Parser::parse()
87 Doctrine\ORM\Query::_parse()
86 Doctrine\ORM\Query::_doExecute()
85 Doctrine\ORM\AbstractQuery::executeIgnoreQueryCache(NULL, 1)
84 Doctrine\ORM\AbstractQuery::execute(NULL, 1)
83 Doctrine\ORM\AbstractQuery::getResult()
82 Neos\Flow\Persistence\Doctrine\Query_Original::getResult()
81 Neos\Flow\Persistence\Doctrine\QueryResult_Original::initialize()
80 Neos\Flow\Persistence\Doctrine\QueryResult_Original::rewind()
79 TYPO3Fluid\Fluid\ViewHelpers\ForViewHelper_Original::renderStatic(array|5|, Closure, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
78 TYPO3Fluid\Fluid\ViewHelpers\ForViewHelper_Original::render()
77 call_user_func(array|2|)
76 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::callRenderMethod()
75 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::initializeArgumentsAndRender()
74 TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker_Original::invoke(TYPO3Fluid\Fluid\ViewHelpers\ForViewHelper, array|2|, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
73 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode_Original::evaluate(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
72 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\AbstractNode::evaluateChildNode(TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode, Neos\FluidAdaptor\Core\Rendering\RenderingContext, false)
71 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\AbstractNode::evaluateChildNodes(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
70 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\RootNode_Original::evaluate(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
69 Neos\FluidAdaptor\ViewHelpers\RenderChildrenViewHelper_Original::render()
68 call_user_func(array|2|)
67 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::callRenderMethod()
66 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::initializeArgumentsAndRender()
65 TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker_Original::invoke(“Neos\FluidAdaptor\ViewHelpers\RenderChildrenViewHelper”, array|1|, Neos\FluidAdaptor\Core\Rendering\RenderingContext, Closure)
64 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::renderStatic(array|1|, Closure, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
63 Paginate_action_index_ed77c6aa8f3d3f4473a971a8866690c89ce51f1f::render(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
62 TYPO3Fluid\Fluid\View\AbstractTemplateView::render()
61 Neos\Flow\Mvc\Controller\ActionController_Original::renderView()
60 Neos\Flow\Mvc\Controller\ActionController_Original::callActionMethod()
59 Neos\Flow\Mvc\Controller\ActionController_Original::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
58 Neos\FluidAdaptor\Core\Widget\AbstractWidgetController::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
57 Neos\FluidAdaptor\Core\Widget\AbstractWidgetViewHelper::initiateSubRequest()
56 Neos\FluidAdaptor\ViewHelpers\Widget\PaginateViewHelper_Original::render()
55 call_user_func(array|2|)
54 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::callRenderMethod()
53 Neos\FluidAdaptor\Core\Widget\AbstractWidgetViewHelper::initializeArgumentsAndRender()
52 TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker_Original::invoke(Neos\FluidAdaptor\ViewHelpers\Widget\PaginateViewHelper, array|3|, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
51 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode_Original::evaluate(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
50 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\AbstractNode::evaluateChildNode(TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode, Neos\FluidAdaptor\Core\Rendering\RenderingContext, false)
49 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\AbstractNode::evaluateChildNodes(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
48 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::renderChildren()
47 TYPO3Fluid\Fluid\ViewHelpers\SectionViewHelper_Original::render()
46 call_user_func(array|2|)
45 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::callRenderMethod()
44 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::initializeArgumentsAndRender()
43 TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker_Original::invoke(TYPO3Fluid\Fluid\ViewHelpers\SectionViewHelper, array|1|, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
42 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode_Original::evaluate(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
41 TYPO3Fluid\Fluid\View\AbstractTemplateView::renderSection(“Content”, array|3|, false)
40 Neos\FluidAdaptor\View\AbstractTemplateView::renderSection(“Content”, array|3|, false)
39 TYPO3Fluid\Fluid\ViewHelpers\RenderViewHelper_Original::renderStatic(array|8|, Closure, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
38 layout_Default_html_faaecdac3112cf581845b9de6a9c2cf67a6cd9e5::render(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
37 TYPO3Fluid\Fluid\View\AbstractTemplateView::render()
36 Neos\Flow\Mvc\Controller\ActionController_Original::renderView()
35 Your\Package\Controller\OrderController::renderView()
34 call_user_func_array(array|2|, array|0|)
33 Your\Package\Controller\OrderController::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
32 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
31 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
30 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
29 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
28 Your\Package\Controller\OrderController::renderView()
27 Neos\Flow\Mvc\Controller\ActionController_Original::callActionMethod()
26 Your\Package\Controller\OrderController::callActionMethod()
25 call_user_func_array(array|2|, array|0|)
24 Your\Package\Controller\OrderController::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
23 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
22 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
21 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
20 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
19 Your\Package\Controller\OrderController::callActionMethod()
18 Neos\Flow\Mvc\Controller\ActionController_Original::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
17 Your\Package\Controller\OrderController::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
16 call_user_func_array(array|2|, array|2|)
15 Your\Package\Controller\OrderController::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
14 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
13 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
12 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
11 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
10 Your\Package\Controller\OrderController::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
9 Neos\Flow\Mvc\Dispatcher_Original::initiateDispatchLoop(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
8 Neos\Flow\Mvc\Dispatcher_Original::dispatch(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
7 call_user_func_array(array|2|, array|2|)
6 Neos\Flow\ObjectManagement\DependencyInjection\DependencyProxy::__call(“dispatch”, array|2|)
5 Neos\Flow\Mvc\DispatchComponent_Original::handle(Neos\Flow\Http\Component\ComponentContext)
4 Neos\Flow\Http\Component\ComponentChain_Original::handle(Neos\Flow\Http\Component\ComponentContext)
3 Neos\Flow\Http\Component\ComponentChain_Original::handle(Neos\Flow\Http\Component\ComponentContext)
2 Neos\Flow\Http\RequestHandler::handleRequest()
1 Neos\Flow\Core\Bootstrap::run()

Previous exception: Exception in line 492 of /var/www/public/Packages/Libraries/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php: SELECT e FROM Your\Package\Domain\Model\Order e WHERE NOT(e.shippings IS NULL)

92 Doctrine\ORM\Query\QueryException::dqlError(“SELECT e FROM Your\Package\Domain\Model\Order e WHERE NOT(e.shippings IS NULL)”)
91 Doctrine\ORM\Query\Parser::semanticalError(“line 0, col 57 near ‘shippings IS’: Error: Invalid…pression or SingleValuedAssociationField expected.”, array|3|)
90 Doctrine\ORM\Query\Parser::processDeferredPathExpressions()
89 Doctrine\ORM\Query\Parser::getAST()
88 Doctrine\ORM\Query\Parser::parse()
87 Doctrine\ORM\Query::_parse()
86 Doctrine\ORM\Query::_doExecute()
85 Doctrine\ORM\AbstractQuery::executeIgnoreQueryCache(NULL, 1)
84 Doctrine\ORM\AbstractQuery::execute(NULL, 1)
83 Doctrine\ORM\AbstractQuery::getResult()
82 Neos\Flow\Persistence\Doctrine\Query_Original::getResult()
81 Neos\Flow\Persistence\Doctrine\QueryResult_Original::initialize()
80 Neos\Flow\Persistence\Doctrine\QueryResult_Original::rewind()
79 TYPO3Fluid\Fluid\ViewHelpers\ForViewHelper_Original::renderStatic(array|5|, Closure, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
78 TYPO3Fluid\Fluid\ViewHelpers\ForViewHelper_Original::render()
77 call_user_func(array|2|)
76 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::callRenderMethod()
75 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::initializeArgumentsAndRender()
74 TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker_Original::invoke(TYPO3Fluid\Fluid\ViewHelpers\ForViewHelper, array|2|, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
73 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode_Original::evaluate(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
72 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\AbstractNode::evaluateChildNode(TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode, Neos\FluidAdaptor\Core\Rendering\RenderingContext, false)
71 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\AbstractNode::evaluateChildNodes(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
70 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\RootNode_Original::evaluate(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
69 Neos\FluidAdaptor\ViewHelpers\RenderChildrenViewHelper_Original::render()
68 call_user_func(array|2|)
67 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::callRenderMethod()
66 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::initializeArgumentsAndRender()
65 TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker_Original::invoke(“Neos\FluidAdaptor\ViewHelpers\RenderChildrenViewHelper”, array|1|, Neos\FluidAdaptor\Core\Rendering\RenderingContext, Closure)
64 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::renderStatic(array|1|, Closure, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
63 Paginate_action_index_ed77c6aa8f3d3f4473a971a8866690c89ce51f1f::render(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
62 TYPO3Fluid\Fluid\View\AbstractTemplateView::render()
61 Neos\Flow\Mvc\Controller\ActionController_Original::renderView()
60 Neos\Flow\Mvc\Controller\ActionController_Original::callActionMethod()
59 Neos\Flow\Mvc\Controller\ActionController_Original::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
58 Neos\FluidAdaptor\Core\Widget\AbstractWidgetController::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
57 Neos\FluidAdaptor\Core\Widget\AbstractWidgetViewHelper::initiateSubRequest()
56 Neos\FluidAdaptor\ViewHelpers\Widget\PaginateViewHelper_Original::render()
55 call_user_func(array|2|)
54 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::callRenderMethod()
53 Neos\FluidAdaptor\Core\Widget\AbstractWidgetViewHelper::initializeArgumentsAndRender()
52 TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker_Original::invoke(Neos\FluidAdaptor\ViewHelpers\Widget\PaginateViewHelper, array|3|, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
51 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode_Original::evaluate(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
50 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\AbstractNode::evaluateChildNode(TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode, Neos\FluidAdaptor\Core\Rendering\RenderingContext, false)
49 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\AbstractNode::evaluateChildNodes(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
48 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::renderChildren()
47 TYPO3Fluid\Fluid\ViewHelpers\SectionViewHelper_Original::render()
46 call_user_func(array|2|)
45 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::callRenderMethod()
44 TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper::initializeArgumentsAndRender()
43 TYPO3Fluid\Fluid\Core\ViewHelper\ViewHelperInvoker_Original::invoke(TYPO3Fluid\Fluid\ViewHelpers\SectionViewHelper, array|1|, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
42 TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode_Original::evaluate(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
41 TYPO3Fluid\Fluid\View\AbstractTemplateView::renderSection(“Content”, array|3|, false)
40 Neos\FluidAdaptor\View\AbstractTemplateView::renderSection(“Content”, array|3|, false)
39 TYPO3Fluid\Fluid\ViewHelpers\RenderViewHelper_Original::renderStatic(array|8|, Closure, Neos\FluidAdaptor\Core\Rendering\RenderingContext)
38 layout_Default_html_faaecdac3112cf581845b9de6a9c2cf67a6cd9e5::render(Neos\FluidAdaptor\Core\Rendering\RenderingContext)
37 TYPO3Fluid\Fluid\View\AbstractTemplateView::render()
36 Neos\Flow\Mvc\Controller\ActionController_Original::renderView()
35 Your\Package\Controller\OrderController::renderView()
34 call_user_func_array(array|2|, array|0|)
33 Your\Package\Controller\OrderController::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
32 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
31 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
30 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
29 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
28 Your\Package\Controller\OrderController::renderView()
27 Neos\Flow\Mvc\Controller\ActionController_Original::callActionMethod()
26 Your\Package\Controller\OrderController::callActionMethod()
25 call_user_func_array(array|2|, array|0|)
24 Your\Package\Controller\OrderController::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
23 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
22 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
21 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
20 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
19 Your\Package\Controller\OrderController::callActionMethod()
18 Neos\Flow\Mvc\Controller\ActionController_Original::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
17 Your\Package\Controller\OrderController::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
16 call_user_func_array(array|2|, array|2|)
15 Your\Package\Controller\OrderController::Flow_Aop_Proxy_invokeJoinPoint(Neos\Flow\Aop\JoinPoint)
14 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
13 Neos\Flow\Security\Aspect\PolicyEnforcementAspect_Original::enforcePolicy(Neos\Flow\Aop\JoinPoint)
12 Neos\Flow\Aop\Advice\AroundAdvice::invoke(Neos\Flow\Aop\JoinPoint)
11 Neos\Flow\Aop\Advice\AdviceChain::proceed(Neos\Flow\Aop\JoinPoint)
10 Your\Package\Controller\OrderController::processRequest(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
9 Neos\Flow\Mvc\Dispatcher_Original::initiateDispatchLoop(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
8 Neos\Flow\Mvc\Dispatcher_Original::dispatch(Neos\Flow\Mvc\ActionRequest, Neos\Flow\Mvc\ActionResponse)
7 call_user_func_array(array|2|, array|2|)
6 Neos\Flow\ObjectManagement\DependencyInjection\DependencyProxy::__call(“dispatch”, array|2|)
5 Neos\Flow\Mvc\DispatchComponent_Original::handle(Neos\Flow\Http\Component\ComponentContext)
4 Neos\Flow\Http\Component\ComponentChain_Original::handle(Neos\Flow\Http\Component\ComponentContext)
3 Neos\Flow\Http\Component\ComponentChain_Original::handle(Neos\Flow\Http\Component\ComponentContext)
2 Neos\Flow\Http\RequestHandler::handleRequest()
1 Neos\Flow\Core\Bootstrap::run()

HTTP REQUEST:
[request was empty]

HTTP RESPONSE:
[response was empty]

PHP PROCESS:
Inode: 926068
PID: 2123
UID: 1000
GID: 1001
User: vagrant

[array] => 
    previousException:
    [string] => Exception in line 492 of /var/www/public/Packages/Libraries/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php: SELECT e FROM Your\Package\Domain\Model\Order e WHERE NOT(e.shippings IS NULL)

Hey and this might come late, but maybe it helps someone else:

The issue here is, that doctrine’s “isNull” query expression method returns a string instead of another query expression that can be negated with “->not()” (see https://github.com/neos/flow-development-collection/blob/master/Neos.Flow/Classes/Persistence/Doctrine/Query.php#L482).
NOT(x IS NULL) is not valid SQL AFAIK and the correct form would be IS NOT NULL, which the specialized query builder method “isNotNull” creates. Now, somehow we do not have that made available in Flow with our Query wrapper.

Edit: Apparently, “NOT(x IS NULL)” would be valid at least in some SQL variants. See http://sqlfiddle.com/#!9/a6c585/164191/0

So, currently the workaround is $query->getQueryBuilder()->expr()->isNotNull()
I’ll take care to create an issue and PR to fix this missing case.

Edit2: I totally missed the part that “x” in this case is a multi-valued property (*ToMany). So that’s indeed where is*Null won’t help, because you can’t compare a relation to null in DQL. That’s what “isEmpty” is for. See https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#get-all-users-that-have-more-than-1-phonenumber
So for the case “is not empty” the correct DQL would be “WHERE SIZE(x) > 0” - but we don’t have a matching “size()” operation on our Flow Query wrapper (doctrine also doesn’t have an expr method for that). Hence the workaround solution is “$query->matching(‘SIZE(shippings) > 0’)” - and yes, you can directly write DQL parts in the query builder, but we should provide a method for that.

1 Like

Note: I created https://github.com/neos/flow-development-collection/issues/2126 to add missing methods to the Query object interface. Adding those methods should be relatively easy, so if anyone feels like it, you are highly welcome to create a PR :slight_smile: