| @@ 10-86 (lines=77) @@ | ||
| 7 | use hiapi\query\Specification; |
|
| 8 | use yii\db\Query; |
|
| 9 | ||
| 10 | class PlanRepository extends \hiapi\repositories\BaseRepository |
|
| 11 | { |
|
| 12 | /** |
|
| 13 | * @var ConnectionInterface |
|
| 14 | */ |
|
| 15 | private $db; |
|
| 16 | /** |
|
| 17 | * @var PlanFactory |
|
| 18 | */ |
|
| 19 | private $planFactory; |
|
| 20 | /** |
|
| 21 | * @var PlanHydrator |
|
| 22 | */ |
|
| 23 | private $planHydrator; |
|
| 24 | /** |
|
| 25 | * @var PriceHydrator |
|
| 26 | */ |
|
| 27 | private $priceHydrator; |
|
| 28 | ||
| 29 | public function __construct( |
|
| 30 | ConnectionInterface $db, |
|
| 31 | PlanFactory $planFactory, |
|
| 32 | PlanHydrator $planHydrator, |
|
| 33 | PriceHydrator $priceHydrator, |
|
| 34 | array $config = [] |
|
| 35 | ) { |
|
| 36 | parent::__construct($config); |
|
| 37 | ||
| 38 | $this->db = $db; |
|
| 39 | $this->planFactory = $planFactory; |
|
| 40 | $this->planHydrator = $planHydrator; |
|
| 41 | $this->priceHydrator = $priceHydrator; |
|
| 42 | } |
|
| 43 | ||
| 44 | public function findAll(Specification $specification) |
|
| 45 | { |
|
| 46 | $mutator = (new QueryMutator((new Query()) |
|
| 47 | ->select(['p.obj_id as id', 'p.name']) |
|
| 48 | ->from('tariff p') |
|
| 49 | ))->apply($specification); |
|
| 50 | ||
| 51 | $rows = $mutator->getQuery()->createCommand($this->db)->queryAll(); |
|
| 52 | $this->extendWithPrices($rows); |
|
| 53 | ||
| 54 | $plans = $this->planHydrator->hydrateMultiple($this->planFactory->createPrototype(), $rows); |
|
| 55 | ||
| 56 | return $plans; |
|
| 57 | } |
|
| 58 | ||
| 59 | private function extendWithPrices(&$rows) |
|
| 60 | { |
|
| 61 | $tariff_ids = array_column($rows, 'id'); |
|
| 62 | ||
| 63 | $pricesRows = (new Query()) |
|
| 64 | ->select([ |
|
| 65 | 'tr.id', 'tr.tariff_id', |
|
| 66 | 'tr.object_id as target_id', 'ob.label as target_name', 'tt.obj_id as target_type_id', 'tt.name as target_type_name', |
|
| 67 | 'rt.obj_id as type_id', 'rt.name as type', |
|
| 68 | 'tr.quantity', 'tu.name as unit', |
|
| 69 | 'cu.name as currency', 'round(tr.price)' // todo: do not round |
|
| 70 | ]) |
|
| 71 | ->from('tariff_resource tr') |
|
| 72 | ->leftJoin('zref rt', 'rt.obj_id = tr.type_id') |
|
| 73 | ->leftJoin('obj ob', 'ob.obj_id = tr.object_id') |
|
| 74 | ->leftJoin('zref tt', 'tt.obj_id = ob.class_id') |
|
| 75 | ->leftJoin('zref tu', 'tu.obj_id = tr.unit_id') |
|
| 76 | ->leftJoin('zref cu', 'cu.obj_id = tr.currency_id') |
|
| 77 | ->where(['tr.tariff_id' => $tariff_ids]) |
|
| 78 | ->createCommand($this->db)->queryAll(); |
|
| 79 | ||
| 80 | foreach ($rows as &$plan) { |
|
| 81 | $plan['prices'] = $this->priceHydrator->hydrateMultiple(array_filter($pricesRows, function ($row) use ($plan) { |
|
| 82 | return $row['tariff_id'] === $plan['id']; |
|
| 83 | })); |
|
| 84 | } |
|
| 85 | } |
|
| 86 | } |
|
| 87 | ||
| @@ 10-86 (lines=77) @@ | ||
| 7 | use hiapi\query\Specification; |
|
| 8 | use yii\db\Query; |
|
| 9 | ||
| 10 | class PlanRepository extends \hiapi\repositories\BaseRepository |
|
| 11 | { |
|
| 12 | /** |
|
| 13 | * @var ConnectionInterface |
|
| 14 | */ |
|
| 15 | private $db; |
|
| 16 | /** |
|
| 17 | * @var PlanFactory |
|
| 18 | */ |
|
| 19 | private $planFactory; |
|
| 20 | /** |
|
| 21 | * @var PlanHydrator |
|
| 22 | */ |
|
| 23 | private $planHydrator; |
|
| 24 | /** |
|
| 25 | * @var PriceHydrator |
|
| 26 | */ |
|
| 27 | private $priceHydrator; |
|
| 28 | ||
| 29 | public function __construct( |
|
| 30 | ConnectionInterface $db, |
|
| 31 | PlanFactory $planFactory, |
|
| 32 | PlanHydrator $planHydrator, |
|
| 33 | PriceHydrator $priceHydrator, |
|
| 34 | array $config = [] |
|
| 35 | ) { |
|
| 36 | parent::__construct($config); |
|
| 37 | ||
| 38 | $this->db = $db; |
|
| 39 | $this->planFactory = $planFactory; |
|
| 40 | $this->planHydrator = $planHydrator; |
|
| 41 | $this->priceHydrator = $priceHydrator; |
|
| 42 | } |
|
| 43 | ||
| 44 | public function findAll(Specification $specification) |
|
| 45 | { |
|
| 46 | $mutator = (new QueryMutator((new Query()) |
|
| 47 | ->select(['p.obj_id as id', 'p.name']) |
|
| 48 | ->from('tariff p') |
|
| 49 | ))->apply($specification); |
|
| 50 | ||
| 51 | $rows = $mutator->getQuery()->createCommand($this->db)->queryAll(); |
|
| 52 | $this->extendWithPrices($rows); |
|
| 53 | ||
| 54 | $plans = $this->planHydrator->hydrateMultiple($this->planFactory->createPrototype(), $rows); |
|
| 55 | ||
| 56 | return $plans; |
|
| 57 | } |
|
| 58 | ||
| 59 | private function extendWithPrices(&$rows) |
|
| 60 | { |
|
| 61 | $tariff_ids = array_column($rows, 'id'); |
|
| 62 | ||
| 63 | $pricesRows = (new Query()) |
|
| 64 | ->select([ |
|
| 65 | 'tr.id', 'tr.tariff_id', |
|
| 66 | 'tr.object_id as target_id', 'ob.label as target_name', 'tt.obj_id as target_type_id', 'tt.name as target_type_name', |
|
| 67 | 'rt.obj_id as type_id', 'rt.name as type', |
|
| 68 | 'tr.quantity', 'tu.name as unit', |
|
| 69 | 'cu.name as currency', 'round(tr.price)' // todo: do not round |
|
| 70 | ]) |
|
| 71 | ->from('tariff_resource tr') |
|
| 72 | ->leftJoin('zref rt', 'rt.obj_id = tr.type_id') |
|
| 73 | ->leftJoin('obj ob', 'ob.obj_id = tr.object_id') |
|
| 74 | ->leftJoin('zref tt', 'tt.obj_id = ob.class_id') |
|
| 75 | ->leftJoin('zref tu', 'tu.obj_id = tr.unit_id') |
|
| 76 | ->leftJoin('zref cu', 'cu.obj_id = tr.currency_id') |
|
| 77 | ->where(['tr.tariff_id' => $tariff_ids]) |
|
| 78 | ->createCommand($this->db)->queryAll(); |
|
| 79 | ||
| 80 | foreach ($rows as &$plan) { |
|
| 81 | $plan['prices'] = $this->priceHydrator->hydrateMultiple(array_filter($pricesRows, function ($row) use ($plan) { |
|
| 82 | return $row['tariff_id'] === $plan['id']; |
|
| 83 | })); |
|
| 84 | } |
|
| 85 | } |
|
| 86 | } |
|
| 87 | ||