Spojení tabulek pomocí cizího klíče

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

Nette Framework 2.0.3 pro PHP 5.3,

Mám prosbu, začinám s nete a nedaří se mne první spojení tabulek.

SELECT *
FROM hardware , surovina
WHERE automat_id =1
AND surovina_id = surovina.id

snažím se uvedený příkaz napsat v nete.

$this->template->hardwares = $this->context->database->table(‚hardware‘, ‚surovina‘)->where(array(‚automat_id‘ ⇒ $this->id, ‚hardware.surovina_id‘ ⇒ ‚surovina.id‘))->order(‚automat_id ASC‘);

v šabloně mám což asi taky není správně

{foreach $hardwares as $hardware}
<tr class=„odd“>
<td>{$hardware->id}</td>
<td>{$hardware->automat_id}</td>
<td>{$hardware->cislotlac}</td>

výsledek je prázdný dotaz.

Moc děkuji za nakonutí.

vvoody
Člen | 910
+
0
-

Skús popísať ako by mal vyzerať výstup, možno nájdeme optimálnejšie riešenie než pokladanie dotazu cez dve tabuľky. A taktiež uveď štruktúru tabuliek. Npr nieje jasné v ktorej tabuľke je atribút automat_id.

Karel Chramosil
Člen | 114
+
0
-

TABULKA hardware
id
automat_id
cislotlac
surovina_id
cena
typmotor1
motor1
vacka1
poznamka1

TABULKA surovina
id
typsurovin
vaha
zapsal_id
datum_zapsal

Výstupem má být:
hardware.cislotlac, surovina.typsurovin, hardware.cena, .....

vvoody
Člen | 910
+
0
-

aha kazdy hardware ma jenu surovinu, potom:

presenter

$this->template->hardware = $this->context->database->table('hardware')->where('automat_id',$this->id);

sablona

{foreach $hardware as $hardwareRow}
	{? $surovinaRow = $item->ref('surovina_id','surovina')}
	<tr n:class="$iterator->odd?odd">
		<td>{$hardwareRow->cislotlac}</td>
		<td>{$surovinaRow->typsurovin}</td>
		<td>{$hardwareRow->cena}</td>
		...
	</tr>
{/foreach}

edit: zabudol som na order ;)

Editoval vvoody (14. 6. 2012 21:59)

Karel Chramosil
Člen | 114
+
0
-

Děkuji, ale laděnka se bouří:

Undefined variable: item search►

</tr>
67: </thead>
68: <tbody>
69: <?php $iterations = 0; foreach ($iterator = $_l->its[] = new Nette\Iterators\CachingIterator($hardware) as $hardwareRow): $surovinaRow = $item->ref(‚surovina_id‘,‚surovina‘) ?>
70: <tr<?php if ($_l->tmp = array_filter(array($iterator->add?‚odd‘:null))) echo ' class=„' . htmlSpecialChars(implode(“ „, array_unique($_l->tmp))) . ‚“‘ ?>>
71: <td><?php echo Nette\Templating\Helpers::escapeHtml($hardwareRow->id, ENT_NOQUOTES) ?></td>
72: <td><?php echo Nette\Templating\Helpers::escapeHtml($surovinaRow->typsurovin, ENT_NOQUOTES) ?></td>
73: <td><?php echo Nette\Templating\Helpers::escapeHtml($hardwareRow->cislotlac, ENT_NOQUOTES) ?></td>

vvoody
Člen | 910
+
0
-

pardon :) takto:

{foreach $hardware as $hardwareRow}
        {? $surovinaRow = $hardwareRow->ref('surovina_id','surovina')}
        <tr n:class="$iterator->odd?odd">
                <td>{$hardwareRow->cislotlac}</td>
                <td>{$surovinaRow->typsurovin}</td>
                <td>{$hardwareRow->cena}</td>
                ...
        </tr>
{/foreach}
Karel Chramosil
Člen | 114
+
0
-

Děkuji, ale stále bojuji.
Laděnka hlásí Trying to get property of non-object
na řádku

<td>{$surovinaRow->typsurovin}</td>

ještě jsem do databáze doplnil

ALTER TABLE hardware
ADD CONSTRAINT fk_hardware FOREIGN KEY (surovina_id)
REFERENCES typauto (id);

Do proměnné $surovinaRow se mne nenačte požadovaný řádek

vvoody
Člen | 910
+
0
-

:D to je uz na facku asi, prehodil som poradie parametrov

{? $surovinaRow = $hardwareRow->ref('surovina','surovina_id')}
Karel Chramosil
Člen | 114
+
0
-

{? $surovinaRow = $hardwareRow->ref(‚surovina‘,‚surovina_id‘)}

Uvedený dotaz se provede s nulovým výsledkem jednička je surovina_id laděnka vypíše:

SELECT id
FROM surovina
WHERE (surovina.id IN (1))

Mám prosbu toto řešení vede že pro každý řádek výpisu se provede dotaz v tabulce surovina. To popírá význam SQL jazyka. Pro malý počet řádků je to jedno, ale v případě více řádků je to cesta do pekel.

vvoody
Člen | 910
+
0
-

Tak mas nastaveny FK na hardware.surovina_id odkazujuci na surovina.id? Mozno sme sa nepochopili ako mas nastavene FK. Pozeram ze vlastne sem tahas nejaku tretiu tabulku typauto:

Karel Chramosil napsal(a):

ještě jsem do databáze doplnil

ALTER TABLE hardware
ADD CONSTRAINT fk_hardware FOREIGN KEY (surovina_id)
REFERENCES typauto (id);

Prosim skus slovne vysvetlit obsah tabuliek a ich vazby.

Pri tom vypise sa pre kazdy riadok polozi dotaz len pri prvom requeste, pre dalsich uz su IDcka nacachovane, preto Nette Database polozi vzdy len jeden dotaz nad tabulkou, uvidis to potom v debugbare.

Karel Chramosil
Člen | 114
+
0
-

Chci poděkovat. Nakonec jsem nette přemluvil.

Karel Chramosil
Člen | 114
+
0
-

Řešení se mne povedlo po pro jednu tabulku.

mám tabulku automat a tabulku typauto
id id
vyrobcislo typautomat
revize
 typ_id

pro tabulku automat jsem deklaroval cizí klíč nevím je-li to správně

ALTER TABLE automat
ADD CONSTRAINT fk_automat FOREIGN KEY (typ_id) REFERENCES typauto (id);

v modulu mám kód

{foreach $automats as $automatRow}
{? $typautoRow = $automatRow->ref(‚typauto‘)}
<tr class=„odd“>
<td>{$automatRow->id}</td>
<td>{$automatRow->vyrobcislo}</td>
<td>{$automatRow->revize}</td>

laděnka mne hlásí chybu:

No reference found for $automat->typauto.

39: <?php $iterations = 0; foreach ($automats as $automatRow): $typautoRow = $automatRow->ref(‚typauto‘) ?>

argument $key „typauto“ (7) je asi správný

Nevím proč mne cizí klíč v jiné tabulce funguje?
Prosím o nápad kde dělám chybu.

vvoody
Člen | 910
+
0
-

On nepozna v ktorom stlpci je FK smerujuci na „typauto“, prva moznost je premenovat „typ_id“ na „typauto_id“ takuto konvenciu by to malo poznat, alebo druha moznost je jednoducho uviest ako druhy parameter nazov toho stlpca kde je FK.

$automatRow->ref('typauto','typ_id');
Karel Chramosil
Člen | 114
+
0
-

Děkuji moc, přejmenoval jsem sloupec v tabulce. Cizí klíč funguje jako hodiny.

Domki
Člen | 310
+
0
-

Chtěl bych se zeptat kde najdu dokumentaci k metode reg

teto {? $surovinaRow = $item->ref(‚surovina_id‘,‚surovina‘)}
Díky

ViPEr*CZ*
Člen | 817
+
0
-

Domki napsal(a):

Chtěl bych se zeptat kde najdu dokumentaci k metode reg

teto {? $surovinaRow = $item->ref(‚surovina_id‘,‚surovina‘)}
Díky

Zkuste toto: https://forum.nette.org/…ledni-sobote