Nekonvenční struktura DB – Autodiscover
- johnygemityg
- Člen | 30
Zdravím, pracuji na projektu, který bohužel nemá správnou strukturu databáze. Čili je velice obtížné spojování tabulek. Dočetl jsem se zde, že by bylo možné nadefinovat cizí klíče a použít funkci Autodiscover. Poradil by mi prosím někdo kde, a jak funkcni Autodiscover zavolat. Děkuji :)
- johnygemityg
- Člen | 30
Zkusil jsem, schéma DB: "":http://oi41.tinypic.com/o735g4.jpg .
$table = $this->database->table('events')->select('events.*, events_related.*');
foreach ($table as $r){
dump($r->name);
}
Chyba : PDOException
No reference found for $events->events_related.
- Šaman
- Člen | 2668
johnygemityg napsal(a):
Zkusil jsem, schéma DB: "":http://oi41.tinypic.com/o735g4.jpg .
$table = $this->database->table('events')->select('events.*, events_related.*'); foreach ($table as $r){ dump($r->name); }
Chyba : PDOException
No reference found for $events->events_related.
Použij nějaké ORM, kde máš možnost nadefinovat si vlastní mapper (nevím, zda to umí YetORM, určitě to umí LeaMapper a ORM Petra Procházky, obě pro Dibi). Tam si všechny atypické klíče a vazební tabulky vypíšeš a dál pracuješ úplně normálně.
- vvoody
- Člen | 910
johnygemityg napsal(a):
Zkusil jsem, schéma DB: "":http://oi41.tinypic.com/o735g4.jpg .
$table = $this->database->table('events')->select('events.*, events_related.*'); foreach ($table as $r){ dump($r->name); }
Chyba : PDOException
No reference found for $events->events_related.
a takto?
$table = $this->database->table('events_related')->select('events.*, events_related.*');
foreach ($table as $r){
dump($r->name);
}
- johnygemityg
- Člen | 30
vvoody napsal(a):
johnygemityg napsal(a):
Zkusil jsem, schéma DB: "":http://oi41.tinypic.com/o735g4.jpg .
> $table = $this->database->table('events')->select('events.*, events_related.*'); > foreach ($table as $r){ > dump($r->name); > }
>
Chyba : PDOException
No reference found for $events->events_related.a takto?
$table = $this->database->table('events_related')->select('events.*, events_related.*'); foreach ($table as $r){ dump($r->name); }
To samé
- David Matějka
- Moderator | 6445
zkus:
//v 2.0
$table = $this->database->table('events')->select('events.*, events_related:*');
//v 2.1
$table = $this->database->table('events')->select('events.*, :events_related.*');
- johnygemityg
- Člen | 30
vvoody napsal(a):
oprava, nie events ale event
$table = $this->database->table('events_related')->select('event.*, events_related.*'); foreach ($table as $r){ dump($r->name); }
Jupííííí :), zdá se že to funguje. Pán bůh ti to oplať ve scriptech :)
- johnygemityg
- Člen | 30
Opět problém schéma : "":http://oi42.tinypic.com/2nqxn6c.jpg
Pokouším se o SQL něco ve smyslu:
SELECT * FROM
lessons
JOIN subjects ON lessons.id_subject
= subjects.id LEFT JOIN events ON events.subject_id = subjects.id WHERE lessons.day = 1 AND lessons.id_student = 2
Zkouším to ze všech stran, ale nedostanu se dál než na No reference found
Předem dík za tip :)
- petr.pavel
- Člen | 535
@johnygemityg: Moc nechápu, co řešíš. Když to vyhodí tu chybu, tak přeci vidíš, jaký dotaz se to pokusilo položit a z něj ti je jasné, jestli se to ptá správné tabulky případně jestli to joinuje podle správného atributu.
Protože máš tabulky pojmenované v množném čísle a tudíž nelze použít jmennou konvenci tabulka_id (navíc někde máš id_ něco, jindě něco _id), musíš mít správně definované relace mezi tabulkami na úrovni databáze. Jestli se ti dotazy nepokládají, jak chceš, zkontroluj cizí klíče.
Editoval petr.pavel (15. 9. 2013 12:51)
- johnygemityg
- Člen | 30
vvoody napsal(a):
Nevidím žiadny kus kódu. Písať to celé za teba nebudem ;)
$table = $this->database->table('lessons')->select('subjects.*,lessons.*')->where( array('day'=>1,'id_student'=> $this->user->getId()) );
foreach($table as $r){
foreach( $r->related('events') as $e){
}
}
PDOException
No reference found for $lessons->subjects.
- johnygemityg
- Člen | 30
petr.pavel napsal(a):
@johnygemityg: Moc nechápu, co řešíš. Když to vyhodí tu chybu, tak přeci vidíš, jaký dotaz se to pokusilo položit a z něj ti je jasné, jestli se to ptá správné tabulky případně jestli to joinuje podle správného atributu.
Protože máš tabulky pojmenované v množném čísle a tudíž nelze použít jmennou konvenci tabulka_id (navíc někde máš id_ něco, jindě něco _id), musíš mít správně definované relace mezi tabulkami na úrovni databáze. Jestli se ti dotazy nepokládají, jak chceš, zkontroluj cizí klíče.
Právě řeším to, že je ta databáze napsaná jako prase, a tak se
snažím vytvářet relace podle cizích klíčů, protože upravit databázi by
znamenalo pomalu přepsat cely kód. Chyba je jasná a stálá:
PDOException
No reference found for xx->yy.
Z toho nejspíš plyne, že ty vazby se netvoří a já řeším proč.
- johnygemityg
- Člen | 30
vvoody napsal(a):
No z predošlého príkladu si sa už mohol dovtípiť že pri discovered nezáleží na názve tabuľky, podstatný je názov klúča. subject namiesto subjects
aha, čili uplně správně by bylo
->select('id_subject.*,lessons.*')
?
- petr.pavel
- Člen | 535
johnygemityg napsal(a):
… Chyba je jasná a stálá:
PDOException
No reference found for xx->yy.Z toho nejspíš plyne, že ty vazby se netvoří a já řeším proč.
Tak jinak. Měl bys vidět SQL, které tvoje konstrukce v NDB vytvoří. Něco jako tohle:

Z toho by ti mělo docvaknout, co máš ve volání NDB špatně. Jestli ne, postni to SQL sem, poradíme ti.
Edit: Se picnu, adresa obrázku na 2i.cz byla jen dočasná. Zkouším tinypic.com.
Editoval petr.pavel (16. 9. 2013 21:43)
- johnygemityg
- Člen | 30
vvoody napsal(a):
nie, nemôžeš použiť názov stĺpca ako odkaz na inú tabuľku, ako by si potom pristupoval k tomu stĺpcu ak by si to potreboval?
Ono to tak momentálně funguje. Tím pádem, ale nechápu co bych měl dosadit za název té tabulky. "":http://oi41.tinypic.com/r1akqe.jpg
Kterou hodnotu odsud. Jinak s tím jak bych to dělal, ja to už dělam.
->select('id_subject.*,lessons.*,lessons.id_subject AS id')
To AS Id je tam kvůli joinovaní preš related(), které asi dosazuje vždy table1.id při joinovaní table2
Jinak díky za pomoc, mám dlouhé vedení :)
Editoval johnygemityg (16. 9. 2013 15:01)