Doctrine 2 - ORM
  1. Doctrine 2 - ORM
  2. DDC-1269

Unexpected behavior while using association on a non primary key field

    Details

    • Type: Improvement Improvement
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Invalid
    • Affects Version/s: 2.1
    • Fix Version/s: None
    • Component/s: None
    • Security Level: All
    • Labels:
      None

      Description

      We have association on non primary key. Something like this:

      Entities\Payment:
        type: entity
        table: payments
        fields:
          id: 
            id: true
            type: integer
            nullable: false
            generator:
              strategy: IDENTITY
      [-- skipped --]
        manyToOne:
          order:
            targetEntity: Entities\Order
            inversedBy: payments
            joinColumn:
              name: scode
              referencedColumnName: scode
      
      Entities\Order:
        type: entity
        table: h_orders
        fields:
          id:
            id: true
            type: integer
            unsigned: false
            nullable: false
            generator:
              strategy: IDENTITY
          scode:
            type: integer
            unsigned: false
            nullable: false
      [-- skipped --]
        oneToMany:
          payments:
            targetEntity: Entities\Payment
            mappedBy: order
      

      When I try to fetch Order from Payment with lazy loading I receive empty Order object with null properties. If I use eager fetching Order object is valid.
      SQL generated for lazy loading seems to be valid, so I suppose the problem is in mapping result to the object. At the same time lazy loading works fine with 2.0.6 version.

      Another problem appears while persisting new Payment.

      $payment = new \Entities\Payment();
      ...
      $order = $this->em->getRepository('\Entities\Order')->find(46320);
      $payment->setOrder($order);
      $order->addPayments($payment);
      $this->em->persist($payment);
      $this->em->flush();
      

      I get this error: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'scode' cannot be null' in /usr/share/php/Doctrine/DBAL/Statement.php:131

      I found issue which is still open and looks like mine – http://www.doctrine-project.org/jira/browse/DDC-1114. What do you think about this?

        Issue Links

          Activity

          Hide
          Steve Müller added a comment -

          This usage is not supported. See: http://www.doctrine-project.org/jira/browse/DDC-1114

          Show
          Steve Müller added a comment - This usage is not supported. See: http://www.doctrine-project.org/jira/browse/DDC-1114
          Hide
          Benjamin Eberlei added a comment -

          Yes, it will not work at all. You dont need to create the second ticket as that error steams from the mapping error.

          You will see an error message when calling ./doctrine orm:schema:validate with this mapping.

          Show
          Benjamin Eberlei added a comment - Yes, it will not work at all. You dont need to create the second ticket as that error steams from the mapping error. You will see an error message when calling ./doctrine orm:schema:validate with this mapping.
          Hide
          Alexandr Torchenko added a comment -

          Should I create second ticket?

          Please confirm that I understood correctly. Should we avoid such mapping as it is considered as invalid.

          Show
          Alexandr Torchenko added a comment - Should I create second ticket? Please confirm that I understood correctly. Should we avoid such mapping as it is considered as invalid.
          Hide
          Benjamin Eberlei added a comment -

          This kind of mapping error is already acknowledged by the schema-validator console task.

          Show
          Benjamin Eberlei added a comment - This kind of mapping error is already acknowledged by the schema-validator console task.
          Hide
          Benjamin Eberlei added a comment -

          Marked as improvement. The problem is we cannot detect this invalid mapping, so no exception is thrown during compilation of the mappings,

          Show
          Benjamin Eberlei added a comment - Marked as improvement. The problem is we cannot detect this invalid mapping, so no exception is thrown during compilation of the mappings,
          Hide
          Benjamin Eberlei added a comment -

          I don't think its supported to use a non primary id for foreign key matching. I cant tell for sure though since i wasnt responsible to design this part of the Doctrine code. I would strongly suggest not to do this.

          Show
          Benjamin Eberlei added a comment - I don't think its supported to use a non primary id for foreign key matching. I cant tell for sure though since i wasnt responsible to design this part of the Doctrine code. I would strongly suggest not to do this.
          Hide
          Benjamin Eberlei added a comment -

          Formatting, please add a second ticket for the second issue.

          Show
          Benjamin Eberlei added a comment - Formatting, please add a second ticket for the second issue.

            People

            • Assignee:
              Benjamin Eberlei
              Reporter:
              Alexandr Torchenko
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: