nefunčkní druhý foreach při dotazu query

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

Zdravím, potřeboval bych osvětlit takovou blbůstku. Můžu jí sice obejít, ale radši problém pochopím :-)

Mám ukázkový presenter, kterej davá do šablony do dvou proměnných ta samá data získaná různým způsobem (druhý způsob je klasicky přes metodu query):

class PokusPresenter extends BasePresenter
{
    public function renderDefault()
    {
	$this->template->nettecreate=$this->context->createArticle();
	$this->template->nettegetquery=$this->context->dotaz->get_query("select * from article");
    }
}

V Šabloně potřebuju projet přes foreach ta samá data 2x – tedy:

{block content}
	<h2>Nette DB create prvni pruchod</h2>
	{foreach $nettecreate as $item}
		{$item->nadpis}<br>
	{/foreach}

	<h2>Nette DB create druhy pruchod</h2>
	{foreach $nettecreate as $item}
		{$item->nadpis}<br>
	{/foreach}

	<br><br>
	<h2>Nette DB query prvni pruchod</h2>
	{foreach $nettegetquery as $item}
		{$item->nadpis}<br>
	{/foreach}

	<h2>Nette DB query druhy pruchod</h2>
	{foreach $nettegetquery as $item}
		{$item->nadpis}<br>
	{/foreach}
{/block}

Jde mi o to, že první způsob ($nettecreate) je bez problémů. Foreach se spustí 2× a data zobrazí tedy také 2×. Druhý způsob ($nettegetquery) mi zobrazí pouze jeden průchod a druhý foreach již nezobrazí nic. Kde je zakopán pes ?

jtousek
Člen | 951
+
0
-

Iterátor proměnné $nettegetquery zřejmě nemá funkční metodu rewind. Pokud se jedná o NoRewindIterator tak je to úplně jasné.

Co vrací ta funkce metoda get_query()?

Editoval jtousek (14. 8. 2012 19:29)

sejmor
Člen | 63
+
0
-

Tady je celej model:

class Dotaz extends Nette\Object {

	private $database;

	public function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}

	public function get_query($sql)
	{
		return($this->database->query($sql));
	}
}
jtousek
Člen | 951
+
0
-

To mi nepomůže když nevím co vrací $this->database->query. ;-)

sejmor
Člen | 63
+
0
-

když proměnou $nettegetquery dumpnu v šabloně tak vrací:

Nette\Database\Statement(4) ▼ {
   connection private => Nette\Database\Connection(6) ▼ {
      dsn private => "mysql:host=localhost;dbname=czechaudiotour" (42)
      driver private => Nette\Database\Drivers\MySqlDriver(1) ▼ {
         connection private => Nette\Database\Connection(6) { *RECURSION* }
      }
      preprocessor private => Nette\Database\SqlPreprocessor(6) ▼ {
         connection private => Nette\Database\Connection(6) { *RECURSION* }
         driver private => Nette\Database\Drivers\MySqlDriver(1) { ... }
         params private => array(1) [ ... ]
         remaining private => array(0)
         counter private => 1
         arrayMode private => "assoc" (5)
      }
      databaseReflection private => Nette\Database\Reflection\DiscoveredReflection(4) ▼ {
         cache protected => Nette\Caching\Cache(4) { ... }
         cacheStorage protected => Nette\Caching\Storages\FileStorage(4) { ... }
         connection protected => Nette\Database\Connection(6) { *RECURSION* }
         structure protected => array(3) { ... }
      }
      cache private => Nette\Caching\Cache(4) ▼ {
         storage private => Nette\Caching\Storages\FileStorage(4) { ... }
         namespace private => "Nette.Database.b7f010e4461b1effee13cbd35f694ed6\x00" (48)
         key private => NULL
         data private => NULL
      }
      onQuery => array(1) ▼ [
         0 => array(2) [ ... ]
      ]
   }
   time private => 0.0006411075592041
   types private => NULL
   queryString => "select * from article" (21)
}

Nebo jak jí mám co nejjednodušejc vytáhnout ?

ViPEr*CZ*
Člen | 813
+
0
-

Zkuste si to ještě fetchnout :-)
https://api.nette.org/…atement.html

Editoval ViPEr*CZ* (14. 8. 2012 20:07)

sejmor
Člen | 63
+
0
-

Když ten dotaz fetchnu … tedy:

$this->template->nettegetquery=$this->context->dotaz->get_query("select * from article")->fetch();

a pak dám v šabloně:

{dump $nettegetquery}

Tak to mi vrátí normálně první záznam z DB:

Nette\Database\Row(8) ▼ {
   id => 1
   nadpis => "CZECH .... " (16)
   text => "<p>CZECH - tedy  ... " (229)
   url => "" (16)
   title => "Czech ... " (16)
   description => "Czech ... " (16)
   lang => "cs" (2)
   publikovano => "1"
}
sejmor
Člen | 63
+
0
-

Ještě jsem si všimnl, že když tu nefetchnutou promenou dumpnu po prvním průchodu foreach tak tam je navíc types private:

Nette\Database\Statement(4) ▼ {
   connection private => Nette\Database\Connection(6) ▼ {
      dsn private => "mysql:host=localhost;dbname=czechaudiotour" (42)
      driver private => Nette\Database\Drivers\MySqlDriver(1) ▼ {
         connection private => Nette\Database\Connection(6) { *RECURSION* }
      }
      preprocessor private => Nette\Database\SqlPreprocessor(6) ▼ {
         connection private => Nette\Database\Connection(6) { *RECURSION* }
         driver private => Nette\Database\Drivers\MySqlDriver(1) { ... }
         params private => array(1) [ ... ]
         remaining private => array(0)
         counter private => 1
         arrayMode private => "assoc" (5)
      }
      databaseReflection private => Nette\Database\Reflection\DiscoveredReflection(4) ▼ {
         cache protected => Nette\Caching\Cache(4) { ... }
         cacheStorage protected => Nette\Caching\Storages\FileStorage(4) { ... }
         connection protected => Nette\Database\Connection(6) { *RECURSION* }
         structure protected => array(3) { ... }
      }
      cache private => Nette\Caching\Cache(4) ▼ {
         storage private => Nette\Caching\Storages\FileStorage(4) { ... }
         namespace private => "Nette.Database.b7f010e4461b1effee13cbd35f694ed6\x00" (48)
         key private => NULL
         data private => NULL
      }
      onQuery => array(1) ▼ [
         0 => array(2) [ ... ]
      ]
   }
   time private => 0.00061798095703125
   types private => array(7) ▼ {
      id => "int" (3)
      nadpis => "string" (6)
      text => "bin" (3)
      url => "bin" (3)
      title => "string" (6)
      description => "string" (6)
      lang => "string" (6)
   }
   queryString => "select * from article" (21)
}