Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$dm->save($user); $user->save(); Но это на мой взгляд вообще не отличие. Ровно как и преимущество DM над AR в том что невозможно измнить mapper, просто не надо хардкодить PDO в конструкторе вот и все. На основе той же доктрины можно сделать AR, они сами описали в кукбуке этот момент.Рекомендую почитать про Doctrine ORM, и причины почему Symfony сделала по дефолту (вместо Prorel) именно Doctrine.
class User {
function table() { return 'db1.user'; }
}
$object->save() и не задумываться о том как был создан объект (эта связь все равно понадобится если захочется реализовать прозрачную выборку связанных объектов)// Объект
$object = new MyObject([id = 2, parent_id = 1]);
// Родительский объект (ленивая загрузка связанного объекта)
$parent = $object->parent; // MyObject([id = 1, parent_id = null]);
// Дочерние объекты (ленивая загрузка связанного объекта)
$childs = $parent->childs; // [MyObject([id = 2, parent_id = 1]), MyObject([id = 4, parent_id = 1])]
// "Магия"
$object->parent_id = 3;
// $object->parent === MyObject([id = 3]) - новый родитель
// $parent->childs === [MyObject([id = 4, parent_id = 1])] - объект удалился у предыдущего родителя
$object->parent = new MyObject([id = 3]);
// $object->parent_id === 3
// $parent->childs === [MyObject([id = 4, parent_id = 1])]
$user = new User();
$user->setFriend($em->find(3, 'Blabla\User'));
$em->flush()$em->flush() и подобных. Т.е. если меняем $object->parent то в $object->parent->childs должен сразу добавиться $object*$object->parent->childs содержит какой то набор объектов («первый набор»), меняем $object->parent и… и ничего, $object->parent->childs по прежнему содержит «первый набор», хотя в реальности этот набор уже изменился — в этом то и проблема (обычно она решается ручным релодом $object->parent->childs, что неудобно и не логично)Вы имеете ввиду что $user->setGroup($group) а потом нужно $group->addUser($user)?
$group->addUser($user) должно быть полностью прозрачно).flush() в примере с OneToMany?public function setParent($parent)
{
$this->parent->removeChild($this);
$parent->addChild($this);
$this->parent = $parent;
}
em->getReference().Недостатки: Вам придется гораздо больше думать, перед тем как написать код.я бы не назвал это недостатком
Active Record против Data Mapper-а для сохранения данных