Chyba v count() pri neexistujúcom zázname v Nette\Database\Selector

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dakota
Člen | 148
+
0
-

Nette Framework 2.0-dev revizia d670a85 released on 2011–01–03

Ak v Nette\Database vypisujem napr. články a k nim počet komentárov

// výpis článkov

$articles = $db->table('article');

foreach ($articles->limit(20)->order('id DESC') as $article) {
	echo 'Title: '.$article->title.'<br>';
	echo 'Comment count: '.$article->related('comment')->count('id').'<br>';
}

// jeden článok

$article = $db->table('article')->get(1);

echo 'Title: '.$article->title.'<br>';
echo 'Comment count: '.$article->related('comment')->count('id').'<br>';

ak článok nemá žiadny komentár, tak to pri danom článku vyhadzuje notice a warning

PHP Notice: Undefined index:  1 in ...\libs\Nette\Nette\Database\Selector\GroupedTableSelection.php:97
PHP Warning: Invalid argument supplied for foreach() in ...\libs\Nette\Nette\Database\Selector\GroupedTableSelection.php:97

možná oprava v GroupedTableSelection.php riadok 97:

// doplnenie if(isset($aggregation[$this->active])) { ... }

if (isset($aggregation[$this->active])) {
	foreach ($aggregation[$this->active] as $val) {
		return $val;
	}
}

Je možné upraviť count() tak, aby vratila 0 v prípade neexistujúcich záznamov (v uvedenom príklade pri neexistujúcom komentári)?

Edit: chyba sa prejavuje pri všetkých agregačných funkciách – max, min, … , v prípade ktorých by to mohlo pri neexistujúcom zázname vrátiť NULL, v prípade count 0.

Editoval dakota (4. 1. 2011 16:47)

dakota
Člen | 148
+
0
-

Chcel by som pripomenúť túto chybu. V NotORM už bola opravená: https://github.com/…6e99598b85f7.

dakota
Člen | 148
+
0
-

Nette Framework 2.0-beta – f951eeb released on 2011–06–02

$article = $db->table('article')->get(1);
echo $article->related('comment')->count('*');

v prípade že článok nemá žiadny komentár tak to vyhodí notice a warning

PHP Notice: Undefined offset:  266 in ...\libs\Nette\Database\Table\GroupedSelection.php:103
PHP Warning: Invalid argument supplied for foreach() in ...\libs\Nette\Database\Table\GroupedSelection.php:103

možná oprava podľa opravy v NotORM https://github.com/…6e99598b85f7:

//GroupedTableSelection

// metóda aggregation - doplnený isset
if (isset($aggregation[$this->active])) {
	foreach ($aggregation[$this->active] as $val) {
		return $val;
     	}
}

// doplnená metóda count
public function count($column = "")
{
	$return = parent::count($column);
	return (isset($return) ? $return : 0);
}
hrach
Člen | 1834
+
0
-

Opravu jsem na pulloval: https://github.com/…tte/pull/266

dakota
Člen | 148
+
0
-

hrach napsal(a):

Opravu jsem na pulloval: https://github.com/…tte/pull/266

Dik, urýchlilo to opravu.