nakešované SQL dotazy z minula?

jik
Člen | 149
+
0
-

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
+
0
-

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

jik
Člen | 149
+
0
-

Aha – děkuji za nakopnutí.

Editoval jik (11. 5. 2020 12:04)