ActiveRow::ref( … ) pro záznam ze stejné tabulky

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

Příjemný podvečer.

V databázi mám mj. tabulku units, která ukazuje cizím klíčem sama do sebe (na nadřazenou jednotku, jedná se o sloupec parent).

Když pak iteruji výběrem určitých jednotek, rád bych se dostal na záznam právě oné nadřazené (čili „o level výš“). Pomocí $row->ref(...) se mi to bohužel nedaří :-(

Mohl by mi někdo, prosím, poradit?

{foreach $units as $unit}
	{dump $unit->ref('unit', 'parent')} {* vyhazuje PDOException:"No reference found for $units->unit" *}
{/foreach}

Předem moc děkuji.

hrach
Člen | 1838
+
0
-

Ouč. to je blbej bug, zkusim vymyslet, jak to opravit.

uestla
Backer | 799
+
0
-

Já si totiž nejsem jist, jestli to tak má fungovat… Poněvadž $row->ref(...) by měl vracet záznam, který ukazuje cizím klíčem právě na $row – jenže já chci věc opačnou, a sice najít v tabulce záznam, na který $row ukazuje.

Nebo se mýlím a ref() funguje oboustranně?

hrach
Člen | 1838
+
0
-

Nene, ref vezme klic z aktualni tabulky a pomoci nej dohleda primarni klic v jine tabulce.
Tzn. ref = hasOne = belongsTo
kdezto related = hasMany

uestla
Backer | 799
+
0
-

Asi si stále nejsem úplně jist.

$row->ref(...) tedy bere klíč záznamu $row a hledá jej v cizí tabulce… ? Pokud ano, je to něco jiného, než bych potřeboval (najít v jiné tabulce klíč na základě neprimárního klíče záznamu $row).

Čili abych to řekl úplně jasně, tak

$row->id ... primární klíč
$row->parent ... cizí klíč sahající do stejné tabulky

A rád bych za pomoci $row získal řádek s primárním klíčem $row->parent.

paranoiq
Člen | 392
+
0
-

popravdě se v ref() a related() sám špatně orientuji. nenapadají vás lepší jména metod?

bojovyletoun
Člen | 667
+
0
-

už jsem si na to zvykl, popravdě je to lepší než v notORM. I když tady respektuji, že každému vyhovuje úplně něco jiného.
Pomůcka:

  • ref = reference(something)= odkaž na něco, ref má 3 písmenka, je kratší, tedy jednoduchá přímá vazba na konkrétní záznam. v reflection taky používá metodu getBelongsToreference. Taky se často používá zkratka $row->something
  • related = Imho tady je jediná pomůcka, že má víc písmen, vrací více záznamů, celou kolekci. Používá getHasManyReference, zápis $row->something nepoužívám (co jsem zkoumal Row::_get(), ani není možný
hrach
Člen | 1838
+
0
-

mně ref a related je jasne, jedine, co mi dělalo problém, bylo navázní na to reflection, a to jsem právě už změnil. ref prakticky ani nepoužovám, to dělám zkráceným zápisem $row->something.

David Grudl
Nette Core | 8228
+
0
-

Nejjednodušší, jak si zapamatovat rozdíl mezi ref a related, je ref vůbec nepoužívat a místo něj „proměnnou“.

uestla
Backer | 799
+
0
-

… chci-li hledat podle primárního klíče a ne podle jiného sloupce (tj. druhý parametr ref()).