[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Число связей
Tim
Как вы решаете такие задачи на фреймворках.

SELECT
`post`.*,
(
SELECT count(*) FROM `comment` WHERE `comment`.`topic_id` = `post`.`id`) as `count_comments`,
`user`.`username`
FROM
`post`
LEFT JOIN
`user`
ON
`user`.`id` = `post`.`user_id`
LIMIT 0, 100



Т.е. мы выбираем посты, джойним для каждого имя автора и подсчитываем кол-во комментариев

Давно не использую фреймворки но я так понимаю должно быть как то так:

$posts = $repository->find();

foreach (.....) {
$post->getComments()->count();
}


Те тут получается что будут получены все комменты для каждого поста. В Symfony я знаю можно переопределить класс репозитория, но тогда в лучшем случае получится то что я написал на SQL. Возможно ли в каком либо из фреймворков сделать это проще? И стоит ли? Возможно в постах стоит завести отдельное поле с кол-вом комментариев?
chee
Tim, ну я это вижу примерно так:

1. Создаем репозиторий PostCommentRepository, добавляем у него метод например findPostWithComments.
2. В методе делаем выборку по твоему запросы выше.
3. Рузультат запроса маппим в модельку Post, кроме поля с результами по количеству комментариев.
4. Затем в модельку добавляю пустую коллекцию для моделек Comment (которая реализует механизмы итератора и получения объекта итератора), в свойства которой указываю количество объектов в коллекции и текущий Post, а на методы итератора повешаю выборку для получения объектов Coment из БД (Lazy loading ёпта).
5. ...
6. PROFIT!!!

В итоге у тебя getComments будет возращать коллекциию пустую, getCount будет содержать правильное значение, но данные в коллекции появятся только тогда когда ты начне ее итерировать.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.