Как получить доступ к вновь сохраненным связанным объектам в Datamapper ORM - PullRequest
1 голос
/ 21 марта 2012

Я использую Datamapper ORM 1.8.2.1 с CodeIgniter 2.1.0, и у меня возникают проблемы с доступом к вновь добавленным связанным объектам из родительского элемента.

У меня есть родительский класс, подобный этому:

class Virement extends DataMapper
{
    var $has_many = array("lignevirement");
    // ...
}

и дочерний класс, подобный следующему:

class LigneVirement extends DataMapper
{
    var $has_one    = array("virement");
    // ...
}

В пользовательском коде я создаю экземпляр этого родителя и добавляю несколько дочерних объектов:

$vrt = new Virement;        // and do some inits on properties.
$vrt->save();

$lili = new LigneVirement;  // do some inits also on properties.
$lili->save();
$vrt->save($lili);

$lili = new LigneVirement;  // do some inits also on properties.
$lili->save();
$vrt->save($lili);

// ...

Когда я затем считаю сразу последобавленные дочерние объекты, я получаю 0:

echo $vrt->lignevirement->count();

... тогда как при просмотре таблицы базы данных видно, что родительская запись была добавлена ​​, все дочерние элементы записи были добавлены , и они правильно связаны с родительской записью.

Кстати, когда я пытаюсь обойти это, я получаю правильное количество дочерних строк:

$vrt = new Virement($vrt->id);

Так что может быть не так с моим кодом выше?

1 Ответ

0 голосов
/ 07 марта 2013

По моему опыту, Datamapper не делает связанные объекты доступными сразу после сохранения.Это включает отображение свойств связанного объекта;Следуя вашему примеру, следующий код не отобразит идентификатор объекта $ vrt:

$vrt = new Virement;
$vrt->get_by_id(1);
$li  = new LigneVirement;
$li->save($vrt);
echo $li->vrt->id;

Однако, если вы перенаправите или перезагрузите страницу, а затем перезагрузитеобъект $ li, все связанные элементы будут доступны, как и ожидалось.

Если вам действительно нужно, чтобы связанные элементы были немедленно доступны, вы можете создать новый связанный объект и загрузить его на основе значения _id, как вы предлагаете.,Что-то вроде:

$vrt = new Virement;
$vrt->get_by_id(1);
$li  = new LigneVirement;
$li->save($vrt);
$vrt_refresh = new Virement;
$vrt_refresh->get_by_id($li->vrt_id);
echo $vrt_refresh->id;

(Очевидно, что приведенный выше код будет излишним, поскольку вы уже знаете идентификатор объекта $ vrt, но это общий принцип).заметка в вашем комментарии о том, что Datamapper использует один и тот же идентификатор для двух новых объектов, я бы не использовал одно и то же имя переменной для обоих объектов;это будет ненадежным в моем опыте.Вместо этого используйте разные имена переменных или (если это неизбежно) взгляните на метод «Очистить»: http://datamapper.wanwizard.eu/pages/utility.html#clear.

...