Spojení tabulek pomocí cizího klíče
- Karel Chramosil
- Člen | 114
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í.
- Karel Chramosil
- Člen | 114
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
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
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>
- Karel Chramosil
- Člen | 114
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
- Karel Chramosil
- Člen | 114
{? $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
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 CONSTRAINTfk_hardware
FOREIGN KEY (surovina_id
)
REFERENCEStypauto
(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
Ř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.
- Karel Chramosil
- Člen | 114
Děkuji moc, přejmenoval jsem sloupec v tabulce. Cizí klíč funguje jako hodiny.
- ViPEr*CZ*
- Člen | 817
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