Nette\Database a spojování tabulek

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

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

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;
umrlec
Člen | 56
+
0
-

Hm, já mám primární klíč jako nazevtabulkyvjednotemcisle_id. Inu, budu to muset předělat. A tohle vyzkoušet. Díky moc za rychlou a vysvětlující odpověď.

Editoval umrlec (20. 2. 2011 18:29)

Jod
Člen | 701
+
0
-

Tiež mám dotaz.
Mám tabuľky Žiadosť s fk firma_kod a Firma so stĺpcom firma_kod. Problém je, že takú db som už dostal a nemôžem meniť jej štruktúru. Ide to nejak joinuť, či som keli? :-/

Vyki
Člen | 388
+
0
-

Jod napsal(a):

Tiež mám dotaz.
Problém je, že takú db som už dostal a nemôžem meniť jej štruktúru.

Nyní dělám projekt, kde se mi stalo přesně to samé. Je to taková zbastlená databáze, že tuto část raději JOINuju ručně.

gawan
Člen | 110
+
0
-

ešte môžeš použiť toto

<?php
$table2 = $row->$tableName()->via($column)	Use non-default column (e.g. created_by)
?>
vrana
Člen | 131
+
0
-

V NotORM se dá vytvořit vlastní struktura, ve které se nestandardní identifikátory dají popsat.

Editoval vrana (22. 3. 2011 10:03)

Jod
Člen | 701
+
0
-

gawan napsal(a):

ešte môžeš použiť toto

<?php
$table2 = $row->$tableName()->via($column)	Use non-default column (e.g. created_by)
?>

Mno $row->firma()->via(‚firma_kod‘); hlási Call to undefined method Nette\Database\Selector\TableRow::firma() :-/

gawan
Člen | 110
+
0
-

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

Jod
Člen | 701
+
0
-

Super, môžem to rovno vyhodiť. Chcelo by to nejaké nepovinné parametre, kde by šlo zapísať párovanie.

Editoval Jod (22. 3. 2011 11:31)

Jod
Člen | 701
+
0
-

Vyki napsal(a):
Nyní dělám projekt, kde se mi stalo přesně to samé. Je to taková zbastlená databáze, že tuto část raději JOINuju ručně.

V Nette/Database ide joinovať ručne?

Vyki
Člen | 388
+
0
-

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)

Jod
Člen | 701
+
+1
-

Aha, ja už som sa tešil na nejaký fluent.. Môžem switchovať na dibi.

knyttl
Člen | 196
+
0
-

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

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

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.

vrana
Člen | 131
+
0
-

V NotORM se to dá napsat takhle:

<?php
$db->invoices()->select("invoices.*, firms.nazev AS firma");
?>

Ale „NotORM way“ je tahle:

<?php
foreach ($db->invoices() as $invoice) {
	$invoice->firm["nazev"];
}
?>
mkoubik
Člen | 728
+
0
-

Edit: špatné vlákno

Editoval mkoubik (28. 5. 2011 18:25)