Doctrine 1
  1. Doctrine 1
  2. DC-93

Calling refreshRelated causes hasOne records to be created in error

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: 1.1.4
    • Fix Version/s: 1.0.13, 1.1.5, 1.2.0-BETA1
    • Component/s: Relations
    • Labels:
      None
    • Environment:
      Linux

      Description

      Calling save() on a record, then refreshRelated(), then save() again will cause hasOne rows to be generated in error. I've attached a Doctrine sandbox with everything you need to reproduce it. Below is a summary.

      schema.yml

      schema.yml
       
      ---
      Staff:
        columns:
          username: string(50)
          password: string(255)
          active:
            type: boolean
            default: true
        indexes:
          user_pass_active_idx:
            fields: [username, password, active]
      
      
      Tickets:
        columns:
          mask:
            unique: true
            type: string(10)
          staff_id: integer(9)
        relations:
          Staff:
            local: staff_id
            foreign: id
      
      Test.php
       
      <?php
      $ticket = new Tickets();
      $ticket->save();
      $ticket->refreshRelated();
      $ticket->save();
      

      Queries that were run:

      root@localhost on doctrine11sandbox
      START TRANSACTION
      INSERT INTO tickets (id, mask, staff_id) VALUES (NULL, NULL, NULL)
      COMMIT
      START TRANSACTION
      *INSERT INTO staff (active) VALUES ('1')*
      UPDATE tickets SET staff_id = '2' WHERE id = '2'
      COMMIT
      

        Activity

        Hide
        Justin Mazzi added a comment -

        This seems to be enough to trigger it:

        <?php
        $ticket = new Tickets();
        $ticket->refreshRelated();
        $ticket->save();
        
        Show
        Justin Mazzi added a comment - This seems to be enough to trigger it: <?php $ticket = new Tickets(); $ticket->refreshRelated(); $ticket->save();
        Hide
        Justin Mazzi added a comment - - edited

        I've tracked this down to fetchRelatedFor. This is the function creating the record:

        LocalKey.php
        <?php
        /*
         *  $Id: LocalKey.php 5798 2009-06-02 15:10:46Z piccoloprincipe $
         *
         * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
         * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
         * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
         * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
         * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
         * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
         * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
         * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
         * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
         * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         *
         * This software consists of voluntary contributions made by many individuals
         * and is licensed under the LGPL. For more information, see
         * <http://www.phpdoctrine.org>.
         */
        
        /**
         * Doctrine_Relation_LocalKey
         * This class represents a local key relation
         *
         * @package     Doctrine
         * @subpackage  Relation
         * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
         * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
         * @link        www.phpdoctrine.org
         * @since       1.0
         * @version     $Revision: 5798 $
         */
        class Doctrine_Relation_LocalKey extends Doctrine_Relation
        {
            /**
             * fetchRelatedFor
             *
             * fetches a component related to given record
             *
             * @param Doctrine_Record $record
             * @return Doctrine_Record|Doctrine_Collection
             */
            public function fetchRelatedFor(Doctrine_Record $record)
            {
                $localFieldName = $record->getTable()->getFieldName($this->definition['local']);
                $id = $record->get($localFieldName);
        
                if (is_null($id) || ! $this->definition['table']->getAttribute(Doctrine::ATTR_LOAD_REFERENCES)) {
                    /* HERE */
                    $related = $this->getTable()->create();
        
        
        Show
        Justin Mazzi added a comment - - edited I've tracked this down to fetchRelatedFor. This is the function creating the record: LocalKey.php <?php /* * $Id: LocalKey.php 5798 2009-06-02 15:10:46Z piccoloprincipe $ * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * and is licensed under the LGPL. For more information, see * <http: //www.phpdoctrine.org>. */ /** * Doctrine_Relation_LocalKey * This class represents a local key relation * * @ package Doctrine * @subpackage Relation * @author Konsta Vesterinen <kvesteri@cc.hut.fi> * @license http: //www.opensource.org/licenses/lgpl-license.php LGPL * @link www.phpdoctrine.org * @since 1.0 * @version $Revision: 5798 $ */ class Doctrine_Relation_LocalKey extends Doctrine_Relation { /** * fetchRelatedFor * * fetches a component related to given record * * @param Doctrine_Record $record * @ return Doctrine_Record|Doctrine_Collection */ public function fetchRelatedFor(Doctrine_Record $record) { $localFieldName = $record->getTable()->getFieldName($ this ->definition['local']); $id = $record->get($localFieldName); if (is_null($id) || ! $ this ->definition['table']->getAttribute(Doctrine::ATTR_LOAD_REFERENCES)) { /* HERE */ $related = $ this ->getTable()->create();

          People

          • Assignee:
            Jonathan H. Wage
            Reporter:
            Justin Mazzi
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: