Výběr dat ze dvou tabulek a případný výpočet hodnoty

cafesk8
Člen | 103
+
0
-

Zdravím,

mám 2 tabulky se stejnou strukturou, kde si bez problému vytáhnu data do ActiveRow, které potřebuji:

tabulky a jejich sloupce
estate_prices (id, input_price, output_price, package_id)
household_prices (id, input_price, output_price, package_id)

	public function getBalicky($castka) {
		$axa 	= $this->getTable()->where(['input_price' => $castka])->whereOr(['package_id' => [1,2,3]])->order('package_id')->fetchPairs('id');
		$slavia = $this->getTable()->where(['input_price' => $castka])->whereOr(['package_id' => [4,5]])->order('package_id')->fetchPairs('id');
		$direct = $this->getTable()->where(['input_price' => $castka])->whereOr(['package_id' => [6]])->order('package_id')->fetchPairs('id');
		$cpp 	= $this->getTable()->where(['input_price' => $castka])->whereOr(['package_id' => [7,8,9]])->order('package_id')->fetchPairs('id');

		return [
			'axa'		=> $axa,
			'slavia'	=> $slavia,
			'direct'	=> $direct,
			'cpp'		=> $cpp
		];
	}

Toto mi vrací správně požadované pole, se zanořenými ActiveRows

$balicky = $this->estatePricesRepository->getBalicky($castka);
// mi správně vrátí
$balicky = [
	'axa'	=> [
		XXX_id 	=> ActiveRow[],
		XXY_id	=> ActiveRow[]
	],
	'cpp'	=> [
		YYY_id	=> ActiveRow[],
		YYX_id	=> ActiveRow[]
	],
	...
]

Problém nastává, kdy potřebuji v tabulce estate_prices najít výsledky dle částky X pokud se stejným package_id existuje řádek s částkou Y v tabulce household_prices.

Mám to takto a vrací to správné výsledky:

public function getCombination($estate_input_price,$house_input_price)  {
	$axa 	= $this->database->query('SELECT * FROM estate_prices a WHERE input_price = ? AND package_id IN (?) AND EXISTS (SELECT * FROM household_prices b WHERE b.input_price = ? AND b.package_id IN (?))',$estate_input_price,[1,2,3],$house_input_price,[1,2,3])->fetchPairs('id');
	$cpp 	= $this->database->query('SELECT * FROM estate_prices a WHERE input_price = ? AND package_id IN (?) AND EXISTS (SELECT * FROM household_prices b WHERE b.input_price = ? AND b.package_id IN (?))',$estate_input_price,[7,8,9],$house_input_price,[7,8,9])->fetchPairs('id');
	$slavia = $this->database->query('SELECT * FROM estate_prices a WHERE input_price = ? AND package_id IN (?) AND EXISTS (SELECT * FROM household_prices b WHERE b.input_price = ? AND b.package_id IN (?))',$estate_input_price,[4,5],$house_input_price,[4,5])->fetchPairs('id');
	$direct = $this->database->query('SELECT * FROM estate_prices a WHERE input_price = ? AND package_id IN (?) AND EXISTS (SELECT * FROM household_prices b WHERE b.input_price = ? AND b.package_id IN (?))',$estate_input_price,[6],$house_input_price,[6])->fetchPairs('id');

	return [
		'axa'		=> $axa,
		'slavia'	=> $slavia,
		'direct'	=> $direct,
		'cpp'		=> $cpp
	];
}

Toto mi také vrací požadovaný výsledek, ale namísto ActiveRows to jsou to DatabaseRows, na které nemohu volat ->ref(), což já v šabloně potřebuji.

$balicky = $this->estatePricesRepository->getCombination($estate_castka,$household_castka);
// mi vrátí
$balicky = [
    'axa'   => [
        XXX_id  => DatabaseRow[],
        XXY_id  => DatabaseRow[]
    ],
    'cpp'   => [
        YYY_id  => DatabaseRow[],
        YYX_id  => DatabaseRow[]
    ],
    ...
]

Ještě bych potřeboval nejlépe v tomto dotazu sečíst hodnoty output_price z obou tabulek a nějak je vrátit, výsledek bych si asi představoval takto:

$balicky = [
	'axa'	=> [
		XXX_id 	=> [
			'data' 	=> ActiveRow[],
			'sum'	=> sectena hodnota // household_prices.output_price + estate_prices.output_price
		],
		XXY_id	=> [
			'data' => ActiveRow[],
			'sum'	=> sectena hodnota // household_prices.output_price + estate_prices.output_price
		]
	],
	'cpp'	=> [
		YYY_id	=> [
			'data' 	=> ActiveRow[],
			'sum'	=> sectena hodnota // household_prices.output_price + estate_prices.output_price
		],
		YYX_id	=> [
			'data' => ActiveRow[],
			'sum'	=> sectena hodnota // household_prices.output_price + estate_prices.output_price
		]
	],
	...
]

PS: Vytvoření 3. tabulky není možnost.

Kdybyste mi někdo poradili, budu moc vděčný.

Děkuji

cafesk8
Člen | 103
+
0
-

Zdravím,

tak sem to vyřešil následovným dotazem:

$axa = $this->getTable()->select('id, input_price, output_price, package_id, output_price+1 AS cena_celkem')
	->order('output_price')
	->where('input_price','2000000')
	->where('EXISTS(SELECT * FROM household_prices WHERE input_price = 300000 AND package_id IN (1,2,3))')
	->where('package_id',[1,2,3])
	->fetchAll();

Problém je v tom, že nejsem schopen do $this->getTable()->select() dostat hodnotu z jiné tabulky, na druhou tablku z první nenavazují žádné klíče, takže ..., output_price + household_prices.output.price AS cena_celkem apod. mi logicky nefungují.

Někdo nějaký nápad? Děkuji