@Vlad200293

MVC | Где получать имя категории, пользователей?

Делаю mvc oop блог, и столкнулся с вопросом
Есть пост, в котором отображется катерия и автор. В базе данных лежат category_id и author_id
Вопрос в том, как правильно организовать получение имени категории и автора, имея их айди?
Изначально была идея передать объект модели(category, user) в вид, и уже там выполнять нужные методы(getCategoryName или getUserName). Но потом узнал, что это плохая практика, и надо делать вид максимально простым, подавая туда уже готовые данные.
Сейчас пришел к такому решению.
В контроллере для каждого поста добавить элементы:
$postList = Post::getPostList(); // модель возвращает список постов
foreach($postList as $post) {
    $post['category_name'] = Category::getCategoryName($post['category_id']);
    $post['author_name'] = User::getCategoryName($post['author_id']);
}
$view->render($postList); // передаю посты в вид

Можно ли поступить так?
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
rpsv
@rpsv
делай либо хорошо, либо никак
Для начала если хотите использовать ООП перестаньте использовать ассоциативные массивы.
У вас данные из базы забирает маппер/ar/запрос соответственно он и должен заботиться об остальных данных.
Пример (псевдокод):
Вариант 1

$postList = Post::getPostList([
    'join' => [
        'category',
        'author',
    ],
]);
foreach($postList as $post) {
    // то есть маппер у вас уже эти данные получил и перед отдачей объектов инициализировал их
    $post->getCategoryName();
    $post->getAuthorName();
}
$view->render($postList);

Или так:
Вариант 2

$postList = Post::getPostList();

$postIds = array_column($postList, 'id');
$categoryNames = Category::getNamesWherePostId($postIds);
$authorNames = User::getNamesWherePostId($postIds);

foreach($postList as $post) {
    $post['category_name'] = $categoryNames[$post->categoryId] ?? null;
    $post['author_name'] = $authorNames[$post->authorId] ?? null;
}
$view->render($postList);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы