@ozornick

Как завести связи между объектами?

Здравствуйте. Где почитать или объясните кто знает о таком случае.
Имеем
class Operation
        {
            public $id;
            public $date;
            public $user_id;
            
            // Далее сеттеры, геттеры
        }

Теперь нужно вывести все операции совместно с информацией некоего пользователя
class Operation {
// ...
public $user

    // Добавить User    $user = new User::find($this->$user_id)
    public setUser(User $user) {
        $this->user = $user;
    }
}

По сути вопрос можно перефразировать "Как работать с вложенными сущностями?" Стоит ли при создании класса внедрять инъекцию или есть лучший вариант? В основе работа по принципу Data Mapper
UPD: Поправил пост
  • Вопрос задан
  • 262 просмотра
Решения вопроса 1
dmitriylanets
@dmitriylanets
веб-разработчик
1. по логике если operation не может существовать без user то при создании объекта он должен быть обязателен new Operation(new User("username"));
2. public setUser() - неправильно реализован, так нужно: setUser(User $user)
3. Работа с вложенными объектами тема правильная но нужно понимать что для передачи такого объекта в слой хранения нужен будет писать datamapper который будет трансформировать объект в формат хранения бд. Как правило ORM сразу предоставляет инструментарий для этого.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@GreatRash
Я может чего не понимаю, но:

class Operation {
  // ...
}

class UserOperation extends Operation {
  // ...
}
Ответ написан
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
Наверное Вам будет интересно почитать про AR: codengineering.ru/post/3
Ответ написан
qonand
@qonand
Software Engineer
Если правильно понимаю, Вас интересует вопрос как именно связанные данные из реляционного представления преобразовать в объектное. В этом случае рекомендую почитать про паттерн Foreign Key Mapping. Почитать можно у Фаулера, (ну либо просто погуглить)
Ответ написан
trevoga_su
@trevoga_su
Вариант 1.
Как выше сказали - строго необходим объект пользователя, что бы знать его ID.
При сохранении пишем ID объекта пользователя в таблицу операций или, в отдельную таблицу связей, если предполагается связь один ко многим.
DM при сохранении модели Operation имеет в методе сохранения код, который отвечает за связь операции и пользователя.
Грубо говоря, метод operation::save() имеет реализацию, в которой сохраняется связь.
Модель Operation имеет lazy load методы, которые позволяют выцепить объект пользователя:
$operation->getUsers();

Вариант 2.
Реализуем систему, при которой любые свзяи между объектами храним в ОДНОЙ таблице:
id объекта который привязан
id объекта к которому привязан
модель (например, имя класса) которая привязана
модель (например, имя класса) к которому привязан
- тут можно связывать любые объекты в системе
за счет ID объекта модели и имени класса достигается уникальность связей:

234 | 567 | \my\namespace\user | \my\namespace\operation
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 23:00
5000 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект