MYSQL Odkaz na tabulku (FOREIGN KEY)
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- motorcb
- Člen | 552
Zdravím.
S Nette začínám a pokouším se dělat odkazy na tabulky. Mám
následující databázi:
CREATE TABLE `bazar_category` (
`id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`name` VARCHAR(50) NULL DEFAULT NULL,
`href` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `bazar` (
`id` INTEGER NULL AUTO_INCREMENT DEFAULT NULL,
`category_id` INTEGER NULL DEFAULT NULL,
`shop` VARCHAR(10) NULL DEFAULT NULL,
`date` DATETIME NULL DEFAULT NULL,
`title` VARCHAR(100) NULL DEFAULT NULL,
`text` MEDIUMTEXT NULL DEFAULT NULL,
`www` VARCHAR(150) NULL DEFAULT NULL,
`photo` VARCHAR(100) NULL DEFAULT NULL,
`price` VARCHAR(50) NULL DEFAULT NULL,
`vip` INTEGER(1) NULL DEFAULT NULL,
KEY (`id`, `category_id`)
);
ALTER TABLE `bazar` ADD FOREIGN KEY (category_id) REFERENCES `bazar_category` (`id`);
-- ALTER TABLE `bazar` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ALTER TABLE `bazar_category` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Modely:
Bazar.php:
<?php
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class Bazar extends Selection
{
public function __construct(\Nette\Database\Connection $connection)
{
parent::__construct('bazar', $connection);
}
}
Bazar_category.php
<?php
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class Bazar_category extends Selection
{
public function __construct(\Nette\Database\Connection $connection)
{
parent::__construct('bazar_category', $connection);
}
}
config.neon:
factories:
bazar: Bazar
bazar_category: Bazar_category
BazarPresenter.php:
<?php
class BazarPresenter extends BasePresenter
{
public function actionList( $category )
{
$this->template->aBazarList = $this->context->createBazar()->order('date DESC');
}
}
A nyní bych chtěl vypsat všechny inzeráty a k nim název kategorie:
list.latte:
{block content}
<h1>BAZAR</h1>
{foreach $aBazarList as $oBazarDetail}
{$oBazarDetail->title} : {$oBazarDetail->text} | {$oBazarDetail->bazar_category->name}
<hr/>
{/foreach}
{/block}
Spuštění zkončí chybou:
PDOException
No reference found for $bazar->bazar_category.
Nakopnul by mne někdo kde dělám chybu?
Děkuji
- nanuqcz
- Člen | 822
Ahoj, pokud používáš MyISAM, tak název cizího klíče musí být
odvoozen z názvu tabulky. Tzn. pokud se tabulka jmenuje
bazar_category
, tak sloupeček se musí jmenovat
bazar_category_id
.
Pokud používáš InnoDB, tak si zkontroluj, jestli máš u všech cizích klíčů ty cizí klíče také nastavené v databázi.