Skip to content

Повторное использование getById #100

@sahkalit

Description

@sahkalit

Вот такой код:

<?php
$object1 = SomeDao->getById(1);
$object2 = SomeDao->getById(2);

SomeDao->take($object1->setSomeProp('prop1');

$object2 = SomeDao->getById(2);  // Да, мне нужно сделать второй раз getById
SomeDao->take($object1->setSomeProp('prop2');

сохранит в БД только одну первую запись для $object1.
Сделает он это потому, что при первом take, вызывается CommonDaoWorker::uncacheById,
в котором вызывается GenericDAO::uncacheLists. Дальше GenericDAO::dropIdentityMap и в нем есть строчка:
$this->identityMap = array().
Из-за этого, когда мы в следующий раз будем вызывать getById(2), то нам вернется ссылка на объект из кэша(GenericDAO::getById, CommonDaoWorker::getById, BaseDaoWorker::getCachedById) и поэтому, чтобы мы не засетили в него, при попытке take переменная $changed, определенная как
$changed = ($old->$getter() !== $object->$getter()) || ($old->$getter() != $object->$getter());
никогда не будет true, т.к. $old и $object один и тот же объект.

Решается, заменой второй строчки
$object2 = SomeDao->getById(2);
на
$object2 = clone SomeDao->getById(2);

Прокомментируйте пожалуйста, баг ли это и есть ли верное решение.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions