cachovani sql dotazu s chybou – You cannot serialize or unserialize PDO instances

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

Zdravím,

prosím o radu, chtěl bych kešovat výsledky SQl dotazu, ale narazil jsem na chybu „You cannot serialize or unserialize PDO instances“

Chtěl jsem udělat něco takového:

abstract class Table extends \Nette\Object
{

    /** @var Nette\Database\Connection */
    protected $connection;

    protected $storage;

    protected $cache;

    const CACHE_TEMP_DIR =  "temp/cache/";

    /**
     * @param Nette\Database\Connection $db
     * @throws \Nette\InvalidStateException
     */
    public function __construct(\Nette\Database\Connection $db)
    {
        $this->connection = $db;

        $this->storage = new \Nette\Caching\Storages\FileStorage(self::CACHE_TEMP_DIR);
	$this->cache =  new \Nette\Caching\Cache($this->storage);

        if ($this->tableName === NULL) {
            $class = get_class($this);
            throw new \Nette\InvalidStateException("Název tabulky musí být definován v $class::\$tableName.");
        }
    }

    /**
     * Vrací celou tabulku z databáze
     * @return \Nette\Database\Table\Selection
     */
    protected function getTable()
    {
        return $this->connection->table($this->tableName);
    }

    /**
     * Vrací vyfiltrované záznamy na základě vstupního pole
     * (pole array('name' => 'David') se převede na část SQL dotazu WHERE name = 'David')
     * @param array $by
     * @return \Nette\Database\Table\Selection
     */
    public function findBy(array $by)
    {
        if (!isset($this->cache['test'])) {
	    $result = $this->getTable()->where($by);
            $this->cache->save('test', $result);
	} else {
	    $result = $this->cache->load('test');
	}
	return $result;
    }

}

Jenomže když zavolám metodu findBy, tak dostanu chybu výše. Nevíte někdo kde by mohl být problém? Zda to vůbec jde takto řešit, resp. jestli by to nešlo řešit lépe?

Děkuji!

jiri.pudil
Nette Blogger | 1032
+
0
-

Abys mohl uložit objekt do cache, musí se serializovat. A PDO objekty (nad kterými je postavená Nette\Database) serializovat zjevně nelze.

redhead
Člen | 1313
+
0
-

Problém je v tom, že v $result nejsou žádné výsledky dotazu. Dotaz se totiž ještě ani neprovedl. Až když si o ty data řekneš, tak teprv pak se dotaz provede. Když si je naházíš do pole, tak to pole už pak jde uložit do cache.