Reflection discovered, LEFT join

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

Zdravím , zápasím s nekonvenční databázi, potřeboval bych radu jak přepsat jeden SQL příkaz do „nette db syntax“.
Jde o :

SELECT * FROM `events` LEFT JOIN events_related ON events.id = events_related.id_event WHERE  events.relation = 'all' OR events_related.id_student = ?

Tabulka : "":http://oi39.tinypic.com/wionpx.jpg

Tabulka se dál větví, to jsem snad již zvládnul osedlat, protože se jedná vždy o případ, kdy klíč byl v ->(‚table‘). Teď pojím tabulku, kde klíč z první je až v druhé. (šipka směřuje z tabulky).

Skončil jsem hned u:

    $r = $this->database->table('events')->select('events_related.*,events.* ');
    foreach ($r as $s) {
      dump($s->name);
    }
    exit();

Chyba:

PDOException

No reference found for $events->events_related

Děkuji :)

vvoody
Člen | 910
+
0
-

Také query v ndb nenapíšeš. Vyber tabuľku events_related a joini k nim events.

johnygemityg
Člen | 30
+
0
-

To jsem udělal akorát ono mi to pak odfiltruje ty řádky, kde to spojení není. Ne každý prvek z events má prvek v events_related. To se právě dá poznat podle sloupce ralation.

vvoody
Člen | 910
+
0
-
$events = $this->database
	->table('events')
	->where('events.relation = ? OR :events_related.id_student = ?', 'all', $studentId);
	// alebo takto:
	// events_related:id_student
	// neviem ako je na tom stable verzia, ja pouzivam len dev
foreach ($events as $event) {
	$eventsRelated = $event->related('events_related', 'id_event')
		->where('id_student', $studentId);
	foreach ($eventsRelated as $eventRelated) {

	}
}

Nevyberaj dáta z joinutých tabuliek s 1 to manny väzbou, ndb to aj tak zgrupuje podla PK tabuľky z ktorej sa začína. Ku každému eventu si dodatočne vyber všetky events_related záznamy.

Editoval vvoody (14. 10. 2013 0:41)

johnygemityg
Člen | 30
+
0
-

Udělal jsem, že vztahy do events_related se pišou pokaždé. A pak:

$this->database->table('events')->select('events.*,subject_id.name AS sName')->where('events_related:id_student = ? AND events.status = "published" AND events.date_end >= CURDATE() AND id_classes = ?',$this->user->identity->id,$this->user->identity->id_classes)->order('date_end ASC');

Chtěl jsem ještě napsat opak, čili vybrat ty eventy, kde neni ten vztah.

$this->database->table('events')->select('events.*,subject_id.name AS sName')->where('events_related:id_student != ? AND events.status = "published" AND events.date_end >= CURDATE() AND id_classes = ?',$this->user->identity->id,$this->user->identity->id_classes)->order('date_end ASC');

To ale logicky nezabralo. Zkoušel jsem pak různý COUNT(), ale jsem rád že mám to co mám. Děkuji