В настоящее время я пытаюсь войти в (Domain) Models, Datamappers и так далее в PHP.
И в настоящее время у меня возникают некоторые проблемы с пониманием того, как правильно сохранять модели, которые также имеют модели в своем наборе атрибутов.
Например, классический пример user => address.
В базе данных я бы имел отношение 1: 1 между этими двумя.
Теперь, если я создал DataMapper, который возвращает мне заполненную модель с набором адресов. Как я смогу изменить этот адрес и сохранить его?
Учитывая тот факт, что user_table имеет поле «address_id»
Вот как я бы сейчас это сделал:
// user model
class Model_User {
/*
* Other getter /setters
*/
...
function setAddress(Model_Address $address) {
$this->_address = $address
}
}
// usermapper
class Mapper_User {
function save(Model_User $user) {
$data = array(
'id' => $user->getId(),
'address_id' => $user->getAddress()->getId()
);
....
}
}
Но что произойдет, если, например, у пользователя по нескольким причинам несколько адресов? Таким образом, это становится отношением 1: n.
Каждый адрес будет иметь атрибут «user_id», который связывает его с пользователем.
Создать пользовательскую модель снова легко, поскольку вам нужно только извлечь все адреса для пользователя и передать их пользователю в качестве атрибута.
// address model
class Model_Address {
/*
* Other getter /setters
*/
...
function setUserId($user_id) {
$this->_user_id = $user_id
}
}
// address mapper
class Mapper_Address {
public function save(Model_Address $address) {
$data = array(
'id' => $address->getId(),
'user_id' => $address->getUserId()
);
....
}
}// user model
class Model_User {
/*
* Other getter /setters
*/
...
protected $_addresses;
function addAddress(Model_Address $address) {
$this->_addresses[] = $address;
}
}
Но как бы вы сохранили такую модель пользователя?
Сохранить AddressModel перед добавлением его пользователю с правильным user_id?
Позвольте UserMapper создать AddressMapper в функции UserMapper-> save () и сохранить модель адреса? <- Этот кажется мне неправильным.
Надеюсь, что кто-нибудь может мне помочь, так как это беспокоит меня уже некоторое время
Задача ещё не решена.
Других решений пока нет …