Koenig, ты хочешь загружать помимо основного объекта все субобъекты, на которые он ссылается через foreign key?
Delphinum, типо того, чтоб избавится от лишних строк кода, то есть сеттер будет примерно таким
public function setKey($id) {
$this->key = new SubClass($id);
}
Koenig, обычно связи грузятся "лениво" (lazy load) по требованию. Тобишь грузится они не должны, если программист прямо об этом не запросит. Я встречал два решения этой задачи:
1. На базе Mapper'а - в этом случае связи загружаются через Mapper
2. На базе самой сущности - в этом случае связи загружаются при первом вызове getter'а
Delphinum, а пример можно? я просто кодом понимаю быстрее
все маны начинаю с кода читать, потом схемы и текст
надо написать свой фетч объекта. думаю второй вариант подойдёт
не просто записывать свойства, а пользовать сеттеры
Koenig, Ну представь две таблицы:
{
users: ['id', 'login'],
messages: ['id', 'message', 'author']
}
Для них есть две сущности:
class User{
public $id;
public $login;
}
class Message{
public $id;
public $messag;
public $author;
}
У Message есть связь с User через свойство author, в котором записывается идентификатор юзера, написавшего это сообщение.
Получить эту связь можно двумя способами.
1. Через Mapper:
class MessageMapper extends Mapper{
public function getAuthor(Message $message){
$userId = $message->author;
$userMapper = new UserMapper;
return $userMapper->fetch($userId);
}
}
$mapper = new MessageMapper;
$message = $mapper->fetch(1); // Получаем сообщение с id = 1
$author = $mapper->getAuthor($message); // Получаем автора этого сообщения
Ествественно метод getAuthor можно вынести в UserMapper и т.д., идею это не меняет.
2. Через Entity:
class Message{
...
public function getAuthor(){
$userId = $message->author;
$userMapper = new UserMapper;
return $userMapper->fetch($userId);
}
}
$mapper = new MessageMapper;
$message = $mapper->fetch(1); // Получаем сообщение с id = 1
$author = $message->getAuthor(); // Получаем автора этого сообщения
второй вариант я вижу так
if (!is_object($this->key) {
$this->key = new SubClass;
}
return $this->key;
Delphinum, больше букв писать как по мне через маппер
Koenig, зато проще в реализации, да и можно из одного реализовать второе. Сам я предпочел первый вариант, так как он выделяет из сущности логику восстановления, которая в ней быть (я считаю) не должна, но это спорный вопрос и каждому нравится свое.