Как правильно сохранить реляционную модель с помощью datamapper

В настоящее время я пытаюсь войти в (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() и сохранить модель адреса? <- Мне это кажется неправильным.

Надеюсь, что кто-нибудь может мне помочь, так как это вызывает у меня некоторое время сейчас:)

0 ответов

Другие вопросы по тегам