Nechtěný GROUP při LEFT JOINu
- mildhouse
- Člen | 27
Ahoj,
narazil jsem na zvláštní věc :
Mám tabulku v DB ‚projekt‘ spojenou s tabulkou ‚uzivatel‘, kde projekt.uzivatel_id == uzivatel.id.
Mám 3 záznamy.
- Příklad
Pokud v presenteru napíšu :
// $db je Nette\Database\Context
$res = $db->table('projekt')->order('uzivatel.name');
// $res je Nette\Database\Table\Selection
foreach($res as $row){
dump($row);
}
vygeneruje to SQL dotaz :
SELECT `projekt`.`id`
FROM `projekt`
LEFT JOIN `uzivatel` ON `projekt`.`uzivatel_id` = `uzivatel`.`id`
ORDER BY `uzivatel`.`name`
a vrátí mi 3× Nette\Database\Table\ActiveRow, což je v pořádku.
- Příklad
Pokud ale napíšu :
// $db je Nette\Database\Context
$res = $db->table('projekt')->select('*')->order('uzivatel.name');
// $res je Nette\Database\Table\Selection
foreach($res as $row){
dump($row);
}
vygeneruje
SELECT *
FROM `projekt`
LEFT JOIN `uzivatel` ON `projekt`.`uzivatel_id` = `uzivatel`.`id`
ORDER BY `uzivatel`.`name`
ale vrátí pouze 2× Nette\Database\Table\ActiveRow (výsledek je zGROUPovaný podle uzivatel_id). Pokud vygenerovaný SQL dotaz zadám do Admineru, vrátí mi to 3 řádky, stejně, jako u prvního příkladu.
- Příklad
Abych dostal z Nette\Database správný výsledek, musím napsat :
// $db je Nette\Database\Context
$res = $db->table('projekt')->select('projekt.*')->order('uzivatel.name');
// $res je Nette\Database\Table\Selection
foreach($res as $row){
dump($row);
}
Nevím, jestli je to BUG, nebo to tak má být. Pokud to bug není, pak by asi $res v druhém příkladě neměl vracet Nette\Dtabase\Table\Selection, ale Nette\Dtabase\Table\GroupedSelection. Rozhodně mi ale nepřijde v pořádku, že to vrací jiný výsledek, než přímí dotaz do DB.
Zkoušel jsem v Nette 2.1.x a Nette 2.2.0