Do not prefix table chain with origin table name ‚lv‘. If you want to make self reference, please add alias
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- jik
- Člen | 149
Zdravím,
mám presenter (po malém zjednodušení)
class OkresniPresenter extends SecuredPresenter {
private $kraj, $lv;
public function __construct(\App\Model\Lv $lv,
\App\Model\Kraj $kraj) {
$this->lv = $lv;
$this->kraj = $kraj;
}
protected function startup() {
parent::startup();
}
public function renderDefault($id) {
$this->template->kraj = $this->kraj->getRecord($id);
$this->template->okresy = $this->lv->getKraj($this->datum, $this->sid, $id);
}
}
a šablonu
<table>
<tbody>
{foreach $okresy as $okres}
<tr>
<td>{$okres->id}</td>
<td>{$okres->nazev}</td>
</tr>
{/foreach}
</tbody>
</table>
a tento presenter havaruje na {foreach $okresy as $okres}
se
zprávou:
Do not prefix table chain with origin table name ‚lv‘. If you want to make
self reference, please add alias.
Nevíte, co by to mohlo znamenat?
- jik
- Člen | 149
Ono je toho tam dost, zatím výběr:
CREATE TABLE stat (
id INTEGER PRIMARY KEY,
nazev VARCHAR(60),
znacka VARCHAR(2),
mena VARCHAR (3)
);
CREATE TABLE kraj (
id INTEGER PRIMARY KEY,
stat_id INTEGER REFERENCES stat,
nazev VARCHAR(60),
platnost_od TIMESTAMP,
platnost_do TIMESTAMP,
fu VARCHAR (80),
cufo INTEGER
);
-- tabulka okresu
CREATE TABLE okres (
id INTEGER PRIMARY KEY,
kraj_id INTEGER NOT NULL REFERENCES kraj,
nazev VARCHAR(60),
nuts CHAR(6),
platnost_od TIMESTAMP,
platnost_do TIMESTAMP
);
-- tabulka obci
CREATE TABLE obec (
id INTEGER PRIMARY KEY,
okres_id INTEGER NOT NULL REFERENCES okres,
nazev VARCHAR(60),
psc INTEGER,
platnost_od TIMESTAMP,
platnost_do TIMESTAMP
);
- jik
- Člen | 149
metoda getKraj:
namespace App\Model;
class Okres extends Table {
/** @var string */
protected $tableName = 'okres';
public function getRecord ($id) {
return $this->find($id);
}
public function getAll () {
return $this->findAll();
}
// okresy kraje
public function getKraj ($datum, $kraj) {
return $this->findBy(array('kraj_id'=>$kraj))
->where("$datum BETWEEN platnost_od AND platnost_do")
->order('nazev');
}
}
- jik
- Člen | 149
zpět, beru odjinud:
namespace App\Model;
class Lv extends Table {
/** @var string */
protected $tableName = 'lv';
//model vracejici zadané LV
public function getRecord ($id) {
return $this->find($id);
}
public function getKraj ($datum, $subject, $kraj) {
return $this->findBy(array('subject_id'=>$subject, 'lv.obec.okres.kraj_id'=>$kraj))
->select('katastr.obec.okres.id AS id, katastr.obec.okres.nazev AS nazev')
->where("$datum BETWEEN platnost_od AND platnost_do")
->order('katastr.obec.okres_id');
}
je tam i metoda „o patro výše“:
public function getStat ($datum, $subject) {
return $this->findBy(array('subject_id'=>$subject))
->select('katastr.obec.okres.kraj.id AS id, katastr.obec.okres.kraj.nazev AS nazev, cufo')
->where("'$datum' BETWEEN lv.platnost_od AND lv.platnost_do")
->order('katastr.obec.okres.kraj_id');
}
která jede dobře.
Editoval jik (8. 9. 2016 15:05)
- Jan Mikeš
- Člen | 771
Ok, pokud jsem pochopil správně tvou strukturu a exception msg, problém je v tom, že pokud jsi v kontextu tabulky lv, neměl bys jí uvádět v sql dotazech (prefixovat).
public function getKraj ($datum, $subject, $kraj) {
return $this->findBy(array('subject_id'=>$subject, 'lv.obec.okres.kraj_id'=>$kraj))
->select('katastr.obec.okres.id AS id, katastr.obec.okres.nazev AS nazev')
->where("$datum BETWEEN platnost_od AND platnost_do")
->order('katastr.obec.okres_id');
}
Zkus přepsat na
public function getKraj ($datum, $subject, $kraj) {
return $this->findBy(array('subject_id'=>$subject, 'obec.okres.kraj_id'=>$kraj)) // zde odstranit lv.
->select('katastr.obec.okres.id AS id, katastr.obec.okres.nazev AS nazev')
->where("$datum BETWEEN platnost_od AND platnost_do")
->order('katastr.obec.okres_id');
}
Případně stejný úkon provést i v ostatních metodách ve tvé
třídě App\Model\Lv