This looks like a bug to me.

We'd probably need to fix the DQL and/or metadata API to have the
subclasses stored in parent class metadata, or have all discriminator
mappings checked (and the inheritance re-constructed from there) in the
SQLWalker.

@Stefano can you come up with a failing test case?


Marco Pivetta

http://twitter.com/Ocramius

http://ocramius.github.com/

On 5 December 2014 at 11:26, Stefano Angaran <[email protected]>
wrote:

> I was looking at Doctrine SQLWalker code and that was my conclusion too.
>
> I think I will refactor my query code then. If I change the FROM clause to
> look for B items I can make it work without using instance of operator.
>
> My suggestion is also to better clarify this in the INSTANCE OF operator
> documentation stating that it should be used only to search for leaf
> entities, what you think?
>
> Il giorno venerdì 5 dicembre 2014 11:22:50 UTC+1, Jàπ (Jasper N. Brouwer)
> ha scritto:
>>
>> I think I misjudged how Doctine handles these filters :(
>>
>> It seems that when filtering on "instanceof B", it will produce a query
>> that will search for a row with `type = B`. Because B is in fact an
>> abstract class, it will never exist in the db, so the query will indeed
>> return an empty result set.
>>
>> Seeing this in action, I think this is intended behavior, and your
>> use-case is unfortunately not supported.
>>
>> If it would be supported, it would mean that Doctrine would have to
>> figure out the inheritance graph beforehand, then create a query that will
>> check not only `type = B`, but every child of B as well. That would impact
>> performance, which is my guess as to why this isn't supported.
>>
>> I'm afraid the only solution right now is to filter on "instanceof D or
>> instanceof E".
>>
>> PS: If your inheritance graph will get larger, it will pay of to use
>> composition (together with associations) in stead of inheritance.
>>
>> --
>> Jasper N. Brouwer
>> (@jaspernbrouwer)
>>
>>
>> On 5 December 2014 at 10:41:15, Stefano Angaran ([email protected])
>> wrote:
>> > Here it is. I've made some edit to reduce attributes number but the
>> > structure is intact
>> >
>> > SELECT p0_.id AS id0, p0_.name AS name1, c1_.attr AS attr6, f3_.sku AS
>> > sku7, c5_.foo AS foo8, c5_.bar AS bar9, p0_.type AS type12 FROM A p0_
>> LEFT
>> > JOIN C c1_ ON p0_.id = c1_.id LEFT JOIN B f3_ ON p0_.id = f3_.id LEFT
>> JOIN
>> > D f4_ ON p0_.id = f4_.id WHERE p0_.type IN ('B')
>> >
>> > Only B is added in the WHERE expression. Am I doing something wrong or
>> is
>> > it how it's supposed to work?
>>
>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "doctrine-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/doctrine-user.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to