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

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

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.

motorcb
Člen | 552
+
0
-

To nanuqcz
Díky za info.
Ano, používám InnoDB a FOREIGN KEY mám nastaven:
ALTER TABLE bazar ADD FOREIGN KEY (category_id) REFERENCES bazar_category (id);
Ještě jsem to překontroloval v Phpmyadminu. Problém stále přetrvává :(

nanuqcz
Člen | 822
+
0
-

I tak bych to zkusil přejmenovat, ať k sobě pasují názvy. Taky mě ještě napadá, tabulka bazar nemá nastavený PRIMARY KEY ?

vvoody
Člen | 910
+
0
-
{$oBazarDetail->ref('bazar_category','category_id')->name}
motorcb
Člen | 552
+
0
-

Přejmenování na stejné názvy pomohlo. Vyřešeno.
Díky moc za rady