nakešované SQL dotazy z minula?
- jik
- Člen | 149
Dobrý den,
mám takovou záležitost, která se mi čas od času opakuje.
Toho času na PHP 7.2.5, PostgreSQL 10, Nette 2.4.
Mám tabulky:
`CREATE TABLE typpriz (
id SERIAL,
kod VARCHAR (1),
…)`
`CREATE TABLE dap (
id SERIAL,
stat_id INTEGER REFFERENCES stat,
…
typpriz_id INTEGER REFFERENCES typpriz,
…)`
k tomu mám modely Table.php, Typpriz.php a Dap.php
abstract class Table {
protected $context;
protected $tableName;
public function __construct(Nette\Database\Context $db) {
$this->context = $db;
if ($this->tableName === NULL) {
$class = get_class($this);
throw new Nette\InvalidStateException("Název tabulky musí být definován v $class::\$tableName.");
}
}
protected function getTable() {
return $this->context->table($this->tableName);
}
public function find($id) {
return $this->getTable()->get($id);
}
...
<?php
namespace App\Model;
class Typpriz extends Table {
protected $tableName = 'typpriz';
...
<?php
namespace App\Model;
class Dap extends Table {
protected $tableName = 'dap';
public function getRecord ($id) {
return $this->find($id);
}
...
model Dap nějak používám a při vývoji (doplňování nových částí) některý z prezenterů někdy (ne moc často – stane se to ‚několikrát‘ za rok) najednou vyhodí chybu. Nějaký čas to zlobí, ale potom najednou se to ‚uklidní‘ a šlape jak má. Přibližně takto:
$o_dap = $this->dapRepos->getRecord($id);
...
$o_dap->typpriz->kod;
Cannot read an undeclared column 'typ_priz'
Obecně si myslím, že $this->dapRepos->getRecord($id)
by
mělo vytvořit dotaz typu: SELECT * FROM dap WHERE (id=281)
. Pokud
se však podívám do laděnky, mám tam
SELECT "id", "kraj_id", "rok_id" FROM "dap" WHERE ("dap"."id" = '281')
.
Jakoby nakešovaný SQL dotaz odněkdy z minula. Pokud si explicitně dumpnu
$o_dap->typpriz_id, objeví se v laděnce
SELECT "id", "kraj_id", "rok_id", "typpriz_id" FROM "dap" WHERE ("dap"."id" = '281')
–
tedy objeví se tam i ta položka typpriz_id (hodnota odpovídá odkazované
tabulce) – a tato položka zůstane v dotazu i pro příště, ale nadále
hlásí, že Cannot read an undeclared column 'typ_priz'
.
Nepomáhá ani smazání cache. V rutinním provozu se to myslím dosud
nestalo.
Nevíte co by se s tím dalo dělat?
Editoval jik (11. 5. 2020 11:36)
- David Matějka
- Moderator | 6445
ano, nette database si cachuje, ke kterým sloupečkům se přistoupilo, aby
nevybíralo ty, které se nepoužívají. ale z toho tvého problému to
vypadá, že se sloupec jmenuje typpriz_id
, ale snažíš se
přistoupit k typ_priz
a ne k typpriz
, jak to máš
v tom ukázkovým kódu