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

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?

Jan Mikeš
Člen | 771
+
0
-

Ukaž prosím strukturu databáze pro tabulky použité ve tvé ukázce kódu.

David Matějka
Moderator | 6445
+
0
-

a ukaz metodu getKraj

jik
Člen | 149
+
0
-

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

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

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

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

CZechBoY
Člen | 3608
+
0
-

Jop, pokud primarni tabulka neni konecna (tzn. jdes z ni pak jeste na nejakou jinou tabulku pres tecku) tak ji nesmis uvadet.

jik
Člen | 149
+
0
-

Děkuji, to jsem zase přehlídl pěknou blbost.