Nette\Database a spojování tabulek
- umrlec
- Člen | 56
Zdravím,
chtěl bych se zeptat, jak v Nette\Database provést spojení tabulek. Procházel jsem dokumentaci, fórum a jsem z toho těžce zmatený. Nejlepší bude asi uvést klasický SQL dotaz, který potřebuju provést v Nette\Database. Takže:
SELECT * FROM tabulka1 AS a INNER JOIN tabulka2 AS b ON a.id = b.id WHERE a.nejakysloupec=nejakahodnota
Děkuju
- dakota
- Člen | 148
Pri Nette\Database je potrebné dodržiavať určitú mennu konveciu definovanú v DatabaseReflection.
Tabuľka table1:
- id – primárny kľúč
- table2_id cudzí kľúč – odkaz na tabuľku table2
- table3_id cudzí kľúč – odkaz na tabuľku table3
Na základe tejto mennej konvecie Nette\Database\Selector automatický vytvára JOIN podľa použitia cudzej tabuľky v metodách select, where, order, group, count.
Napr pri.
$db->table('table1')->where('table2.country_id = ?', 2);
sa vykoná spojenie
SELECT * FROM table1 INNER JOIN table2 ON table2.id = table1.table2_id WHERE table2.country_id = 2;
- gawan
- Člen | 110
Jod napsal(a):
Mno $row->firma()->via(‚firma_kod‘); hlási Call to undefined method
Nette\Database\Selector\TableRow::firma() :-/
v Nette\Database to zdá sa nie je, funguje to len v NotORM.
btw. to Nette\Database sa mi zdá trochu zbytočné … hlavne pokiaľ to bude
neudržiavané a nebudú tam commitované nové vlastnosti z NotORM
- Vyki
- Člen | 388
Jod napsal(a):
V Nette/Database ide joinovať ručne?
Když nepoužiješ TableSelection, tak ano. Píšeš normálně dotazy typu
<?php
$database = new Nette\Database\Connection('mysql:host=localhost;dbname=test', 'root', 'password');
$database->query('
SELECT * FROM cat
LEFT JOIN neco ON cat.id = neco.cat_id
WHERE cat.id = ?', 123)->fetch();
?>
Zkrátka jak se píše zde https://forum.nette.org/…-predstaveni – když nepoužiješ TableSelection je to pouze obálka nad PDO.
Editoval Vyki (22. 3. 2011 23:05)
- knyttl
- Člen | 196
Ten přístup se mi dost líbí, jen nevím, jak bych docílil něčeho takového (ani v NotORM):
<script>
SELECT t1.*
count( distinct t2.tag_id ) as tags_p,
count( distinct t3.tag_id ) as tags_s,
(count( distinct t2.tag_id ) + count( distinct t3.tag_id )) as tags
FROM spaces t1
LEFT JOIN (SELECT space_id, tag_id FROM space2tags
JOIN tags ON space2tags.tag_id = tags.id AND tags.sub = 'primary')
t2 on t1.id = t2.space_id
LEFT JOIN (SELECT space_id, tag_id FROM space2tags
JOIN tags ON space2tags.tag_id = tags.id AND tags.sub = 'secondary')
t3 on t1.id = t3.space_id
</script>
Neformálně – chci vybrat obsah tabulky spaces a k ní počty primárních, sekundárních a všech tagů. No a pak samozřejmě bych chtěl být schopný to řadit jak pomocí sloupců ve spaces, tak i podle počtů tagů.
Editoval knyttr (27. 4. 2011 15:13)
- kralik
- Člen | 230
Ahoj nějak se mi nedaří najít správnou syntaxy.
používám \Nette\Database jenž údajně vychází z NOTORM od Jakuba
V.
(Nette 2.0 alpha a PHP5.3)
Nevím jak si v modelu nadefinovat tento SQL dotaz jenž v Admineru běží.
<?php
SELECT invoices.*, firms.nazev AS firma FROM invoices LEFT JOIN firms ON invoices.firm_id=firms.id
?>
mooc díky za pomoc
- bojovyletoun
- Člen | 667
Pokud nevíš, tak to použíj Connection::query('select...');
Notorm syntaxe má prostě jiný styl myšlení.
Dle mě je to jednoduché, ale tipuji toto :
foreach($db->table('invoices') as $inv){
dump($inv->id);
$f=$inv->ref('firma');
echo $f->name;
}
Tady je úraz v tom, že ty data „máš hned“ k dispozici. Je nějaké best practise, jak data předat do šablony( vyhnout se přesunutí kódu do šablony, či nějakým iteracím, vůbec, tohle by mělo být součástí service/repository)
PS: Znáte funkci na tomtu fóru
alert('Máte rozepsaný příspěvek')
, Čistě ze zvědavosti, lze
zjistit(kromě event.ctrlKey, když link otvírám do nového okna/tabu, páč
mi to alertuji i tak.