Reflection discovered, LEFT join
- johnygemityg
- Člen | 30
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 :)
- johnygemityg
- Člen | 30
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
$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
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