Упрощенная схема таблиц:
Какие идеи/подходы обдумывал/советовали:
1. Использование поведения AttributeBehaivor вместе с событием "afterFind". Проблема в том, что данное поведение обрабатывает индивидуально каждую отдельную запись базы данных, и при получении индивидуальных цен генерируется соответствующее количество запросов. Код импорта поведения в модель Service: https://pastebin.com/DAqpDLaS, код IndividualServicePriceBehavior: https://pastebin.com/DAqpDLaS
2. Реализовывать SQL-запрос вида:
Код: Выделить всё
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();
3. Организовать отдельный метод, куда будет помещаться результат выполнения запроса цены, получать индивидуальные цены по ID пользователя и в цикле изменять цену услуг, в итоге возвращать объект с измененными ценами. Тут ряд минусов начиная от того, что придется делать методы для многих вариаций, проблемы с joinWith, а также небезопасно.