Nekonvenční struktura DB – Autodiscover

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

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 :)

enumag
Člen | 2118
+
0
-
nette:
	database:
		default:
			relection: discovered

…ale je to výchozí nastavení pokud vím.

Mám ale pocit že i při požití discovered reflexe je nutné zachovat nějaké konvence. Nevzpomínám si teď jaké, jen chci říct že i s tím dost možná narazíš.

johnygemityg
Člen | 30
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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é

vvoody
Člen | 910
+
0
-

Ten istý error to vyhodiť nemohlo, pozri sa poriadne

David Matějka
Moderator | 6445
+
0
-

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.*');
vvoody
Člen | 910
+
0
-

oprava, nie events ale event

$table = $this->database->table('events_related')->select('event.*, events_related.*');
foreach ($table as $r){
    dump($r->name);
}
johnygemityg
Člen | 30
+
0
-

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 :)

vvoody
Člen | 910
+
0
-

To bolo funkčné riešenie, teraz to správne:

$table = $this->database->table('events_related');
foreach ($table as $r){
    dump($r->event->name);
    dump($r->student->name);
}
johnygemityg
Člen | 30
+
0
-

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 :)

vvoody
Člen | 910
+
0
-

Nevidím žiadny kus kódu. Písať to celé za teba nebudem ;)

petr.pavel
Člen | 535
+
0
-

@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
+
0
-

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
+
0
-

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č.

vvoody
Člen | 910
+
0
-

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

johnygemityg
Člen | 30
+
0
-

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.*')

?

vvoody
Člen | 910
+
0
-

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?

petr.pavel
Člen | 535
+
0
-

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
+
0
-

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)