Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-357

Lazy-loading in OneToOne-bidirectional associations not working for inverse side

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Minor Minor
    • Resolution: Won't Fix
    • Affects Version/s: 2.0-ALPHA4
    • Fix Version/s: None
    • Component/s: ORM
    • Security Level: All
    • Labels:
      None
    • Environment:
      XAMPP 1.7.3

      Description

      I am referring to the following situation:
      http://www.doctrine-project.org/documentation/manual/2_0/en/association-mapping#one-to-one,-bidirectional

      In this example: if I fetch an object of type "Customer" from my database, a second query is executed immediately that fetches the corresponding "Cart" even if I do not access the $cart property of "Customer". Annotating fetch="LAZY" to the $cart property does not make any difference. This is even worse in case of self-referencing objects, e.g. those having at most one parent object and at most one child object. Here, all associations are created by single database queries at once (e.g. fetching the child object, then the child of the child object and so forth).

      By contrast, OneToMany associations are lazy-loaded from the inverse side (as expected).

      Perhaps I should add, that I am using annotation mappings for my entities (no YAML, no XML).

        Issue Links

          Activity

          Hide
          Christian Stoller added a comment -

          Okay, I see the problem. But it would be nice if this behaviour could be documented.

          Isn't it possible to always put a special proxy object there and if it get's accessed via lazy loading and Doctrine detect's that there is no associated entity, then the proxy will be replaced by a NULL value?

          Show
          Christian Stoller added a comment - Okay, I see the problem. But it would be nice if this behaviour could be documented. Isn't it possible to always put a special proxy object there and if it get's accessed via lazy loading and Doctrine detect's that there is no associated entity, then the proxy will be replaced by a NULL value?
          Hide
          Hernan Rajchert added a comment - - edited

          Hi, I've been faced with this issue some times. I tent to solve this by doing two unidirectional one-to-one. Then I deal with the non existing relationship using a method called getRelation that I defined in a BaseModel.
          I have created this method because Doctrine filled up with a Proxy when I fetch the entity without its relationship (then accesing the object would throw an Exception), and filled up with null when the object was eagerly fetched (left join) but no relationship was found.
          I think we could add this getRelation in the entitymanager or a trait after php 5.4.

          Show
          Hernan Rajchert added a comment - - edited Hi, I've been faced with this issue some times. I tent to solve this by doing two unidirectional one-to-one. Then I deal with the non existing relationship using a method called getRelation that I defined in a BaseModel. I have created this method because Doctrine filled up with a Proxy when I fetch the entity without its relationship (then accesing the object would throw an Exception), and filled up with null when the object was eagerly fetched (left join) but no relationship was found. I think we could add this getRelation in the entitymanager or a trait after php 5.4.
          Hide
          Martin Štekl added a comment -

          Hi,
          I think that idea of special proxy object is not so bad. However if you do not want to create special proxy object and build some logic around it then why do you not want to satisfy at least one of two (currently unsupported) cases?
          I mean the case in which the object type is used in inheritance. This case is easier to solve in my opinion (similar to @OneToMany) and usually wanted. It is better to support at least one possibility then none.

          Show
          Martin Štekl added a comment - Hi, I think that idea of special proxy object is not so bad. However if you do not want to create special proxy object and build some logic around it then why do you not want to satisfy at least one of two (currently unsupported) cases? I mean the case in which the object type is used in inheritance. This case is easier to solve in my opinion (similar to @OneToMany) and usually wanted. It is better to support at least one possibility then none.
          Hide
          Filip Procházka added a comment -

          I'm proposing a solution to this "Won't Fix" that I disagree with https://github.com/doctrine/doctrine2/pull/970

          Show
          Filip Procházka added a comment - I'm proposing a solution to this "Won't Fix" that I disagree with https://github.com/doctrine/doctrine2/pull/970
          Hide
          Doctrine Bot added a comment -

          A related Github Pull-Request [GH-970] was closed:
          https://github.com/doctrine/doctrine2/pull/970

          Show
          Doctrine Bot added a comment - A related Github Pull-Request [GH-970] was closed: https://github.com/doctrine/doctrine2/pull/970

            People

            • Assignee:
              Benjamin Eberlei
              Reporter:
              Marcel Walter
            • Votes:
              0 Vote for this issue
              Watchers:
              8 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: