SELECT, No reference found, klíče
- Tymikes
- Člen | 63
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
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
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
$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
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
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)