Nette database: GroupedSelection :: group – potencionální bug
- winner21
- Člen | 5
Ahoj,
na projektu jsme narazili na dost „unfriendly“ chování nette database v následující replikaci
article[id]
{1}
{2}
comment[id, article_id, some_col]
{1, 1, 1}
{2, 1, 2}
{3, 2, 1}
{4, 2, 2}
{5, 2, 2}
$articles = $db->table('article');
foreach($articles as $article){
foreach($article->related('comments')->group('some_col') as $comment){
echo $comment->id . '-' . $comment->some_col;
}
}
//output
//1 - 1
//2 - 2
//expected
//1 - 1
//2 - 2
//3 - 1
//4 - 2
Data se totiž tahají v jedné query (WHERE IN) a group se provede nad celým výsledkem.
Chtělo by to do Nette\Database\Table\GroupedSelection přepsat group na něco jako
public function group($columns)
{
$this->emptyResultSet();
$columns .= ", $this->name.$this->column";
call_user_func_array(array($this->sqlBuilder, 'setGroup'), [$columns]);
return $this;
}
Nevím zda je to bug nebo featura, ale rozhodně je to dost nevypočitatelné chování, které nás relativně dost potrápilo.
- winner21
- Člen | 5
Já tedy vždy
ActiveRow::related rozuměl jako ekvivalent (zkratku) k
$article->related('comments');
//zkratka pro
$db->table('comments')->where('article_id', $article->id);
A grouped selection pouze jako optimalizaci, aby se nevytvářel dotaz pro každý článek.
Takto se například GroupedSelection::sort vztahuje na konkrétní „active“ kolekci GroupedSelection a group se vztahuje na celý výsledek..
- winner21
- Člen | 5
V podstatě to znamená, že pro následující dva snippety kódu budou mít jiný output.
$articles = $db->table('articles')->where('id', [1, 2]);
foreach($articles as $article){
foreach($article->related('comments')->group('some_col') as $comment){
echo $comment->id . '-' . $comment->some_col;
}
}
//
$articles = [
$db->table('articles')->where('id', 1)->fetch(),
$db->table('articles')->where('id', 2)->fetch()
];
foreach($articles as $article){
foreach($article->related('comments')->group('some_col') as $comment){
echo $comment->id . '-' . $comment->some_col;
}
}
A toto jestli je „expected“, tak jsem rád, že na nové projekty již používáme Doctrine2..
- David Matějka
- Moderator | 6445
na nové projekty již používáme Doctrine2..
+1 :)
Jinak bych to videl na bug, muzes poslat PR?