Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-1110

CTI Entities always trigger ->find even when I'm calling ->getReference

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Minor Minor
    • Resolution: Can't Fix
    • Affects Version/s: None
    • Fix Version/s: 2.1
    • Component/s: ORM
    • Security Level: All
    • Labels:
      None

      Description

      Suppose we have some CTI mapped entities:

      Group <- Company
      

      Without having a given Entity on UnitOfWork IdentityMap, if I do:

      $groupProxy = $em->getReference('Group', 1);
      

      It will trigger the ->find (accessing the DB). This is correct on this situation, because the Entity can be either Group or Company. But if I do:

      $companyProxy = $em->getReference('Company', 1);
      

      There're no sub-classes anymore (Doctrine doesn't know it, but there are other ways to know), so it should correctly return an instance of CompanyProxy instead of trigger the ->find method.

      The solution requires to build the hierarchy of Entities using their ClassMetadata. So it is require to loop though all mapped classes on DiscriminatorMap and check if there's 1 class that subclass the given Entity. If positive, return the result of ->find; otherwise a Proxy can be returned.
      This is a non-optimal solution (a better solution would be to cache the hierarchy together with ClassMetadata), but it fixes the issue.

      Issue could be considered as major since most CTI scenarios trigger unwanted DB queries, but its usage is so restrict that I left as minor.
      We should fix that for 2.1 IMHO.

        Activity

        Hide
        Benjamin Eberlei added a comment -

        Actually doctrine knows it, see the check for $metadata->subClasses, which is always on the grabbed entity. So the behavior is alraedy correct, no way to optimize it.

        $companyProxy = $em->getReference('Company', 1);
        

        Does:

        $cm = $em->getMetadataFor("Company");
        if ($cm->subClasses) // 0 for Company
        
        Show
        Benjamin Eberlei added a comment - Actually doctrine knows it, see the check for $metadata->subClasses, which is always on the grabbed entity. So the behavior is alraedy correct, no way to optimize it. $companyProxy = $em->getReference('Company', 1); Does: $cm = $em->getMetadataFor( "Company" ); if ($cm->subClasses) // 0 for Company

          People

          • Assignee:
            Guilherme Blanco
            Reporter:
            Guilherme Blanco
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: