SELECT, No reference found, klíče

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tymikes
Člen | 63
+
0
-

Snažím o následující

function findZadavatelByID($id_ukolu) {
$uzivatel = $this->findBy(array('id_ukolu', $id_ukolu))->fetchField("id_uzivatele");
return $this->findAll()->select('ukoly.*')
                       ->select(':users.*')
                       ->where(':users.id', $uzivatel);
}

Dostávám chybu No reference found for $ukoly->related(users)

Klíč by měl být nastavený správně. V PhpMyAdmin je normálně propojený a proklikám se.
https://i.imgur.com/9V7zBWN.png

Editoval Tymikes (13. 4. 2016 18:47)

David Matějka
Moderator | 6445
+
0
-

reference je typu „has one“, nikoliv „has many“, jak nyni pouzivas, viz https://doc.nette.org/…ase/explorer#… .. to, co chces je

->select("ukoly.*")
->select("uzivatel.*")
->where("uzivatel.id", $uzivatel)

ale to, ze vybiras z vice tabulek zaroven jde proti filozofii NDBT. Takze bys mel pouzit jen

->findAll()->where("id_uzivatele", $uzivatel)

a pak se na uzivatele dotazovat pres ref(), respeektive jen $ukol->uzivatel->username

Tymikes
Člen | 63
+
0
-

Moc nerozumím jaký způsob mám používat a docela se do toho zamotávám a ref() mě nefunguje.

Jaký je rozdíl, když napíšu třeba.

//Tahám z repozitáře ukoly
$rowUkoly = $this->ukoly->get(array('id_ukolu', $id_ukolu));

//Tahám z repozitáře uzivatele
$rowUzivatele = $this->uzivatele->findById($rowUkoly["id_uzivatele"]);

a pak např.
$rowUkoly["nazev_ukolu"]
$rowUzivatele["email"]

Je tento způsob výše špatně? Nepotřebuji žádné klíče a jednoduše je můžu takto spojit.

A ty reference mi nefungují, ukážu na příkladu, jak to používám, jak jsem to pochopil:

//Jsme v repozitáři úkoly - metoda findAll() tedy dělá toto:
		public function findAll()
		{
		return $this->database->table("ukoly");
		}

        function findZadavatelByID($id_ukolu) {
        $id = $this->findBy(array('id_ukolu', $id_ukolu))->fetchField("id_uzivatele");
		//Tady získám to ID uživatele, který příspěvek vytvořil

        $uzivatele = $this->findAll()->where("id_uzivatele", $id);
		//Tady najdu řádek s tím daným uživatelem.

        $uzivatele->ref("users", "id_uzivatele");
		//Chci propojit s tabulkou users přes cizí klíč id_uzivatele


        dump($uzivatele->email);exit;
		//Chci vytáhnout např. email z tabulky users
        }

A napíše mi, že nejsou žádné reference, co dělám špatně?

Editoval Tymikes (14. 4. 2016 21:42)

David Matějka
Moderator | 6445
+
+1
-
$uzivatele = $this->findAll()->where("id_uzivatele", $id);

tohle ti vrati Selection (neboli nejakou kolekci) s ukoly. Je mi divny, ze na tom vubec jde volat ref(), to existuje totiz jen na ActiveRow. Jak mas presne kod a jakou chybu ti to hlasi?

Unlink
Člen | 298
+
+1
-

Ty potrebuješ získať záznam uživateľa ktorý je priradený k danemu úkolu?
Ak hej, tak najskôr si získaš ten úkol

function findZadavatelByID($id_ukolu) {
		//Nacítas všetky ukoly, ktoré maju id_ukolu rovné parametru (asi je len jeden, kedže to je primarny kluc)
        $selectionUkolov = $this->findAll()->where("id_ukolu", $id_ukolu);
		//Z tohto výberu vyberieš jeden
		$ukol = $selectionUkolov->fetch();
		//Nau ukolom zavoláš ref a dostanes uzivatela
        $uzivatel = $ukol->ref("users", "id_uzivatele");
		//Vypises jeho email
		dump($uzivatele->email);
}

Alebo skrátená verzia priamo skopírovaná z dokumentácie
https://doc.nette.org/…ase/explorer#…

	$this->findAll()->get($id)->ref("users", "id_uzivatele")->email;
Tymikes
Člen | 63
+
0
-

To: David Matějka
Právě, že na to nešel volat ten ref.
Protože jsem tam nepoužil fetch nebo get nebo GetBy, který tam hážou fetch. Proto mi to nefungovalo, jsem si to neuvědomil.

To: Unlink
Jojo, funguje to, až když si to napsal jsem to zjistil, v čem to vězí. (ještě jsem na to šel zbytečně oklikou)

Editoval Tymikes (15. 4. 2016 14:19)