Výběr dat ze dvou tabulek a případný výpočet hodnoty
- cafesk8
- Člen | 103
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
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