Doctrine2 one-to-one relation auto loads on query

前端 未结 6 1704
借酒劲吻你
借酒劲吻你 2020-12-23 12:53

I have a query that looks like this:

My user entity has a one-to-one relation that looks like this:

/**
 * @var UserProfile
 *
 * @ORM\\OneToOne(targ         


        
6条回答
  •  悲哀的现实
    2020-12-23 13:27

    Here is solutions explain with details :

    https://groups.google.com/forum/#!topic/doctrine-user/fkIaKxifDqc

    "fetch" in the mapping is a hint, that is, if it is possible Doctrine does that, but if its not possible, obviously it does not. Proxying for lazy-loading is simply not always possible, technically. The situations where its not possible are:

    1) one-to-one from inverse to owning side (appears only in bidirectional one-to-one associations). Precondition a) above can not be met. 2) one-to-one/many-to-one association to a hierarchy and the targeted class has subclasses (is not a leaf in the class hierarchy). Precondition b) above can not be met.

    In these cases, proxying is technically not possible.

    Your options to avoid this n+1 problem:

    1) fetch-join via DQL: "select c,ca from Customer join c.cart ca". Single query but join, however, joins on to-one associations are relatively cheap.

    2) force partial objects. No additional queries but also no lazy-load: $query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)

    3) if an alternative result format (i.e. getArrayResult()) is sufficient for a use-case, these also avoid this problem.

    Benjamin had some ideas about automatic batching of these loads to avoid n+1 queries but this does not change the fact that proxying is not always possible.

提交回复
热议问题