Related na špatnou tabulku

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

Ahoj,

mám problém s discovery reflection.
Mám následující schéma:

A když se dotazuju

$this->db->table('clanek')->where(':tags.tagsId', 1);

tak mi to zahlásí chybu

Column not found: 1054 Unknown column 'tags.tagsId' in 'where clause'
..........
LEFT JOIN `tagsNew` AS `tags` ON

Tedy chybně se mi to připojuje na tabulku TagsNew a ne na tabulku Tags.

Jde to vyřešit jinak než přejmenováním tabulky Tags?

Díky
Lukáš

konva
Člen | 88
+
0
-

Nikdo neporadí?

Mysteria
Člen | 797
+
0
-

Máš správně cizí klíče? Btw proč máš tabulku Tags a TagsNew? Pokud je to jenom k odlišení „novosti“ tagů, nebo by lepší udělat jenom jednu tabulku a přidat do ní sloupec „new“ a tam mít 0 / 1, jestli je nebo není nový?

konva
Člen | 88
+
0
-

Ahoj,
ty tabulky jsem tak pojmenoval pro zjednoduseni jen v ramci teto ukazky.
Problem ktery resim je v tom, ze mam jednu hlavni tabulku a na ni se odkazuji dve tabulky s podobnym nazvem. No a discovery reflection zrejme vybere nahodne jednu z tech dvou, protoze obe maji vazbu na tu hlavni tabulku a obe se jmenuji podobne.
Mohu ty tabulky pojmenovat jinak to je jasny, ale me zajima jestli existuje reseni pri takoveto strukture.
Diky
Lukas

Mysteria
Člen | 797
+
0
-

Discovery vybírá podle cizích klíčů, pokud je máš správně nadefinované tak by to mělo fungovat, nebo minimálně ti nikdo bez dumpu struktury tabulek a jejich cizích klíčů nemá jak poradit…

konva
Člen | 88
+
0
-

No pokud se nepletu tak Discovery vybírá podle názvu tabulek a ne podle názvu klíče. Tedy když mám tabulku nazvanou „tags“ a ta se odkazuje na tabulku clanek „clanek“ cizim klicem, ktery je pojmenovan treba „ciziKlic1“, tak dotaz je tento

$this->db->table('clanek')->where(':tags.tagsId', 1);

a ne tento

$this->db->table('clanek')->where(':ciziKlic1.tagsId', 1);

Lukas

hrach
Člen | 1838
+
0
-

Pletes se, protoze si necetl dokumentaci. Platí to jen pro hasOne vztah. Pro backjoin je to trochu komplikovanejsi, ale da se to tak pojmout. https://doc.nette.org/…ase/explorer#….

Editoval hrach (18. 1. 2015 20:02)

konva
Člen | 88
+
0
-

Ale vzdyt v te ukazce je take odkaz na nazev tabulky

$selection->where(':book:book_tags.tag.name', 'PHP')
          ->group('author.id')
          ->having('COUNT(:book:book_tags.tag.id) > 0');
hrach
Člen | 1838
+
0
-

Promin, mas samozrejme pravdu. To je tak, kdyz odbiham od uceni a snazim se delat jine veci :) Mozna to bdue bug.

Verze php, Nette!!!, databaze (mysql nebo pgsql se schematy)?

konva
Člen | 88
+
0
-

V pohode :). PHP 5.5.12, Nette 2.2.6, databaze MySql 5.6
Diky
Lukas

hrach
Člen | 1838
+
+1
-

Muzes prosim odebugovat, proc to nefunguje?

Jinak lezerni – smazal si cache?

konva
Člen | 88
+
0
-

kdyz jsem si to odkrokoval tak to neprojde pres tuto podminku

if (stripos($targetColumn, $table) !== FALSE) {

Je to na radku 90. Z nejakyho duvodu to pro tu tabulku tags odmitne cizi klic na tabulku clanky a vrati se k prochazeni dalsich moznosti. Pak projde az ten klic na tu tabulku tagsNew

hrach
Člen | 1838
+
0
-

no a jake jsou ty hodnoty $targetColumn a $table?

konva
Člen | 88
+
0
-

Tak chyba byla na moji strane. Problem byl v tom, ze nazev sloupce v tabulce „tabs“ se nejmenoval „clanekId“ ale „hlavniId“. V tabulce „tabsNew“ se ale klicovy sloupec jmenoval „clanekId“.
V $candidates pak byli obe moznosti, ale vyhral ten klic, ktery je nazvem podobny nazvu hlavni tabulky.
Vyresil jsem to tim, ze jsem to zapsal takto

....->related('tags.hlavniId')....

Díky za pomoc a omlouvám se za vyrušení od studií.
Lukáš