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
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
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)
- David Matějka
- Moderator | 6445
zkus:
$this->payload->data = array_map(function($row) {
return $row->toArray();
}, iterator_to_array($markers));