@MarkLb

Как грамотно реализовать функционал индивидуальных цен в Yii2?

Задача: реализовать для некоторых пользователей индивидуальные цены на услуги. Не для каждой услуги может быть своя индивидуальная цена(то есть, при отсутствии индивидуальной цены выводить стандартную).

Упрощенная схема таблиц:
e7OwvKu.png
Текстом


Таблица: user
Поля: id(type: integer, lenght: 11, AutoIncrement)

Таблица: service
Поля: id(integer, 11, AI), price(float)

Таблица: individual_price
Поля: id(integer, 11, AI), service(integer, 11, relation service.id), user(integer, 11, relation user.id), price(float)
Какие идеи/подходы обдумывал:

1. Использование поведения AttributeBehaivor вместе с событием "afterFind". Проблема в том, что данное поведение обрабатывает индивидуально каждую отдельную запись базы данных, и при получении индивидуальных цен генерируется соответствующее количество запросов. Подробнее здесь.
2. Организовать отдельный метод, куда будет помещаться результат выполнения запроса цены, получать индивидуальные цены по ID пользователя и в цикле изменять цену услуг, в итоге возвращать объект с измененными ценами. Тут ряд минусов начиная от того, что придется делать методы для многих вариаций, проблемы с joinWith, а также небезопасно.

UPD 07.10.18: Вопрос актуален. Обновил и более лучше структурировал.
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 2
kimono
@kimono
Web developer
SELECT `services`.*, `prices`.`amount` FROM `services`
LEFT JOIN `prices` ON `prices`.`service_id` = `services`.`id` AND `prices`.`user_id` = 100

Services::find()->select(['services.*', 'prices.amount'])->leftJoin('prices', ['AND',
  'services.id = prices.amount',
  ['prices.user_id' => Yii::$app->user->id],
])->asArray()->all();
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Актуальная цена должна быть методом в модели services. И в этом методе уже уже реализовать всю магию. Думаю это будет связь с individual_price, проверка на есть ли таковая и если нет постановка базовой.
Далее по afterFind: что мешает использовать массовое сохранение через например:
https://www.yiiframework.com/doc/api/2.0/yii-db-ac... и не совсем понимаю зачем и как Вы тут присобачили AttributeBehavior
Ну а с выборками из базы все верно подсказал Дмитрий Ким
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы