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