в контроллере:
$item = $this->get('item')->load($id); // тут уже всё подготовлено
в сервисе item загружать сущность из базы, сразу же после этого изменять нужные поля в соответствие с ролью пользователя (или что там по бизнес-логике) и отдавать уже готовую изменённую сущность в контроллер.
Если использовать тот сервис, который у вас описан в вопросе, то делать так (в контроллере):
$item = $this->get('item')->load($id); // тут сущность, полученная из базы, можно и репозиторий использовать
$price = $item->getPrice();
$price = $this->get('crbr.price')->actualPrice($price);
$item->setPrice($price);
Но лучше спрятать этот код в сервис.
Qixing: Сервис? а что там делать-то? создавайте класс, и в нём вызывайте репозиторий. Доктрину в него передавайте через конструктор. Почитайте оф. доку о сервисах, посмотрите мою статью, там вкратце используются сервисы. Статья не о них, но кое что узнать можно. Я планирую написать подробную статью о Symfony2, но не в феврале точно.
Qixing: делайте createQueryBuilder в репозитории, и там же добавляйте к нему всё, что нужно. А в контроллере вам нужно будет добавить только ->andWhere('r.rating > :rate')->setParameter(':rate', 3))->getQuery()->getResult();
можно и через репозиторий. Но даже репозиторий лучше использовать в сервисе. А в контроллере будет что-то типа $entities = $this->get('entity')->loadBySum();
Qixing: А куда полезли дальше? Для решения вопроса, или чтобы лучше понимать, как работает?
И если ответ помог, то отметьте его ответом, чтобы другие с подобным вопросом его заметили.
Алексей Елецкий: >каждая парадигма должна быть к месту
Золотые слова! Написать бы их на слитке, платино-иридиевом... Тоже много раз видел применение паттернов и технологий ради их использования, а не ради решения задачи.
Алексей Елецкий: автор вопроса не обозначил язык программирования, поэтому не известно, можно ли сделать функции без класса. Да и вообще, лучше всё-таки запихнуть в класс - ООП же (в тегах вопроса стоит ООП).
ну про контроллер я так сказал, для упрощения описания вопроса. Всё в сервисах, кончено же. В данном случае проблема не в этом.
За совет явно указать join-ы спасибо, попробую.
А вот свой слой кэширования сбоит, то ли я его неправильно готовлю.
Помимо видео, у всех сущностей ещё есть поле author, указывающее на User. И это поле тоже загружается из базы при показе имени автора в шаблоне. Это я пока решаю тем же способом - загружаю из кэша список всех пользователей-авторов (благо, что их всего несколько).
Но если я попытаюсь сделать вот так (чуть упрощённо написал):
то при сохранении в кэш там этот явно присвоенный объект User какой-то кастрированный - часть данных есть, а часть исчезает, например, именно поле name пустое.
Postgres периодически запускает процедуру обслуживания файлов базы, которая называется вакуум. В некоторых случаях, выполнение этой процедуры может затянуться на несколько секунд. Вячеслав УспенскийOnYourLips А как вы боретесь с вакуумом?
Спасибо за подробный ответ! Но я пользуюсь Windows.
В принципе, программа rescuetime.com, предложенная в ответе-решении, имеет похожие возможности. Плюс складирует всё в веб, где через веб-морду можно всё посмотреть. Но вот просмотр у них сделан не очень удачно...
чтобы не было кучи пустых (нулевых) ячеек в бд. И чтобы потом легко было искать нужные строки. Такой подход будет гораздо гибче. А если грамотно поставить индексы, то это будет летать.
Плюс, посмотрите последнюю строчку ответа. Менять структуру таблицы - неправильно, по крайней мере, в ответ на изменение данных, а не задач.
Мене кажется, я всё правильно понял. В приведённой таблице за одну строчку отвечает одна запись в базе данных? А я предлагаю сделать так, чтобы одна запись в бд отвечала за одну ячейку таблицы.
Я тоже один раз взялся доделывать один проект. Он был сделан на приличном фреймворке (ZF1, было года три назад). Так там были методы на 500+ строк, куча (куча!) дублирования в коде, когда приходилось вручную просматривать чуть ли не все строки всех методов класса, да ещё в саппорт-классы надо было заходить править, и в фронтенде на js тоже надо было те же вещи править.
В общем, через месяц отказался. Я не на работу туда устраивался, а на повремёнку, так что счёл возможным смыться.
Это был тот самый случай, когда надо было переписывать. Хотя проект был очень большой.
> Если делать на фраймворке Yii, можно не опасаться смены программиста?
ZF1 тогда был мейнстримом для корпоративного сектора, качественный фреймворк с отличной документацией. Не помогло...
$item = $this->get('item')->load($id); // тут уже всё подготовлено
в сервисе item загружать сущность из базы, сразу же после этого изменять нужные поля в соответствие с ролью пользователя (или что там по бизнес-логике) и отдавать уже готовую изменённую сущность в контроллер.
Если использовать тот сервис, который у вас описан в вопросе, то делать так (в контроллере):
$item = $this->get('item')->load($id); // тут сущность, полученная из базы, можно и репозиторий использовать
$price = $item->getPrice();
$price = $this->get('crbr.price')->actualPrice($price);
$item->setPrice($price);
Но лучше спрятать этот код в сервис.