Prazdný výsledek při dotazu, po iteraci prvků je výsledek dle očekávání

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

Nette sandbox 2.2.0, MariaDB 10.0.10, php -S localhost:80.

Z databáze tahám následujícím způsobem:

<?php

$markers = $this->database->table('markers')
			->where('lat > ?', $latSW)
			->where('lng > ?', $lngSW)
			->where('lat < ?', $latNE)
			->where('lng < ?', $lngNE);

		$this->payload->data = $markers;
		$this->sendPayload();

?>

Výsledek? Nula nula nic.

Pokud ale doplním do kódu konstrukci navíc:

<?php

		$data = array();
		foreach($markers as $marker) {
			$data['lat'] = $marker->lat;
			$data['lng'] = $marker->lng;
			$data['name'] = $marker->name;
			$this->payload->data[] = $data;
		}


		$this->sendPayload();

?>

Výsledky to dává.

Chápu, že to má asi co dělat s lazyloadingem, ale je to bug? Nebo moje chyba? Případně jak se vyvarovat tomu, abych tam musel proiterovat celý pole a rovnou to poslal jako payload…

Díky.

P.S.: kód je vytažen z presenteru, z action metody.

Michal Vyšinský
Člen | 608
+
0
-

Není to bug. Stačí zavolat ještě fetchAll na $markers.

Edit: aby to nebyla tak strohá odpověď: Nette\Database\Table\Selection implementuje Iterator, takže se vše spouští až při potřebě iterovat nad výsledky (to je to lazy).

Editoval Michal Vyšinský (12. 5. 2014 16:32)

potapnik
Člen | 127
+
0
-

Aha. Bomba. Super. Díky za rychlou odpověď :-)

potapnik
Člen | 127
+
0
-

No tak jsme se posunuli o kus dál, teď to vyhazuje obsah pole {„data“:{„1“:{}}}, místo 1 bych ale chtěl všechny prvky…

David Matějka
Moderator | 6445
+
0
-

zkus:

$this->payload->data = array_map(function($row) {
return $row->toArray();
}, iterator_to_array($markers));
potapnik
Člen | 127
+
0
-

Paráda, díky moc! Iterací přes tu anonymní funkci to jde, škoda jen, že je to tak zbytečně overcomplicated.