«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2017/04/04 14:30:13  №966622 1
ОП, ты вроде шарил в Symfony.
Нужно получать кол-во новых комментов к статье по последнему просмотру ее юзером.
Таблица последнего просмотра - article_id, user_id, timestamp; Сущность ActicleLastView.

Сущность Atricle, сериализация через JMS.

Как по уму сделать подсчет кол-ва комментариев появившихся после timestamp по заданному юзеру? Вытаскивать QueryBuilder через leftJoin? Как замэпить полученное число в сущность Article?
Ответы: >>966660 >>967844
Аноним 2017/04/04 15:31:31  №966660 2
>>966622
>Нужно получать кол-во новых комментов к статье по последнему просмотру ее юзером.
Типо, посмотрел коммепнты, поставил временной маркер, а при следующем просмотре просто подгружаешь, комменты которые появились после временни отмеченного временным маркером?

Скинь код и скрин и диаграмму базы.
Ответы: >>966706
Аноним 2017/04/04 17:10:54  №966706 3
>>966660
В целом верно, только кол-во новых показывается в списке, типа стикера с кол-вом новых комментариев в статье после последнего просмотра.

Когда юзер открывает статью - пишу временную метку в ActicleLastView (для таблицы primary key => user_id + article_id).

Потом в списке нужно как-то получить для текущего юзера кол-во комментов оставленных в статье после этой временной метки.

В принципе я уже решил вопрос двумя leftJoin (ActicleLastView, Comments) с кучей условий джойна + groupBy(article_id), но хочется понять, есть ли более элегантное решение, например, с запросами к отношениям как в laravel.

Кстати, вызывают ли @ORM\OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="application", orphanRemoval=true, cascade={"remove"}) дополнительные подзапросы при обращении к свойствам или вытягиваются при любом запросе (в т.ч. и через QB)?
Ответы: >>966717 >>967844
Аноним 2017/04/04 17:29:02  №966717 4
>>966706
Я бы сделал так.
Смотрим комменты.
Записываем номер последнего комментария.
Все не просмотренные комменты - это все комменты у которых собственный номер больше, чем номе последнего коммента.
Чтобы посчитать кол-во их используй конструкцию.
getQuery()->getSingleScalarResult(); Она тебе сразу цифру даст.

Тяжело обьяснять и понимать, кода не видно самой бд. Хуй знает как у тебя там таблицы организованы, какая нормальная форма и тд.

>Кстати, вызывают ли @ORM\OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="application", orphanRemoval=true, cascade={"remove"}) дополнительные подзапросы при обращении к свойствам или вытягиваются при любом запросе (в т.ч. и через QB)?

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

Аноним 2017/04/06 08:27:03  №967844 5
>>966622

Возможно, что проще всего SQL-запросом. У тебя на пару (user, article) хранится только последний просмотр или все? Если второе, то конечно запрос будет посложнее.

> Как замэпить полученное число в сущность Article?
Никак. Одна сущность - одна таблица. Можно сделать только связь M-N между User, Article через промежуточную таблицу с timetamp, но я думаю, что эффективнее просто брать нужные данные SQL запросом.

> Вытаскивать QueryBuilder через leftJoin?
QueryBuilder нужен при сборке запроса в зависимости от условий

>>966678

Был какой-то php multiplexor.

>>966706

SQL запросом лучше всего, не в сущности, а в отдельном сервисе. Получив дату, мы выбираем комментарии по условию time > ?

Зачем усложнять? Сущности/DQL надо использовать когда тебе нужен маппинг, получить 1 цифру из БД проще SQL или DQL запросом (DQL запрос тоже может возвращать 1 число, а не сущность).

> Кстати, вызывают ли @ORM\OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="application", orphanRemoval=true, cascade={"remove"}) дополнительные подзапросы при обращении к свойствам или вытягиваются при любом запросе (в т.ч. и через QB)?

OneToMany не должен вызывать запросов, при загрузке сущности там в поле просто прописывается прокси-коллекция которая лениво загрузится только при обращении к ней.

Имей в виду, что это может вызывать свои проблемы. Представь что у тебя у Поста 1000 комментариев. Если ты сделаешь count($this->comments) то даже это приведет к выборке всех 1000 комментариев в память. Добавление 1 комментария в коллекцию скорее всего тоже вызовет подгрузку существующих.

Хотя по моему, именно для COUNT там есть какая-то опция, которая позволяет сделать SELECT COUNT в такой ситуации.

А вот обратная сторона OneToOne отношения (та сторона, где нет внешнего ключа) по моему вызвает дополнительный джойн, так как без него неясно, что записать в поле - null или прокси-объект с определенным id.

Ну то есть, если представить как работает ленивая загрузка, станет понятно, когда какие запросы вызываются. по умолчанию доктрина пытается откладывать загрузку всего на потом.