nefunkční cizí klíče (dokumentaci jsem četl)

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

Zduř,

mám takovéto tabulky:

SET NAMES utf8;
SET time_zone = '+00:00';
SET foreign_key_checks = 0;
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `title` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nickname` varchar(255) CHARACTER SET utf8 NOT NULL,
  `password` varchar(255) CHARACTER SET utf8 NOT NULL,
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `surname` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `email` varchar(255) CHARACTER SET utf8 NOT NULL,
  `public` tinyint(1) NOT NULL DEFAULT '1',
  `roles_id` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `roles_id` (`roles_id`),
  CONSTRAINT `users_ibfk_1` FOREIGN KEY (`roles_id`) REFERENCES `roles` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

v php volám dotaz nějak takto:

$row = $this->database->table('users')->where('nickname', $username)->fetch();

a pak chci vytáhnout pomocí cizího klíče role:

$row->role->name;

nebo

$row->roles->name;

toto ale zavolá absolutně nesmyslnou chybu:

PDOException #42S22

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'COLUMN_NICKNAME' in 'field list'

jedině, co funguje je:

$row->ref('roles','roles_id')->name;

ale nechápu, proč nefunguje jedno z předchozích řešení? ať jsem hledal jak jsem hledal, nenašel jsem správné řešení ani někoho, kdo by řešil stejný problém … kolega si taky neví rady, nějaký nápad?

věřím, že to bude úplná pitomost, kterou přehlížím :)

David Matějka
Moderator | 6445
+
0
-

Zkus promazat cache.

A precti si, jak formatovat kod, tentokrat jsem to opravil, ale pro priste ;)

m.himlar
Člen | 15
+
0
-

ok, díky :)

no cache jsem promazal, i při každé změně, ale bez úspěchu :-/

ještě pro jistotu composer.json:

{
	"name": "nette/sandbox",
	"description": "The sandbox is a pre-packaged Nette Framework project, basic configured structure for your application.",
	"homepage": "https://nette.org",
	"type": "project",
	"license": ["Unlicense"],
	"authors": [
		{
			"name": "David Grudl",
			"homepage": "http://davidgrudl.com"
		},
		{
			"name": "Nette Community",
			"homepage": "https://nette.org/en/contributors?lang=en"
		}
	],
	"require": {
		"php": ">= 5.3.7",
		"nette/nette": "~2.2.0",
		"dg/adminer-custom": "~1.5",
		"nextras/datagrid": "2.1.2"
	},
	"require-dev": {
		"nette/tester": "~1.0"
	},
	"minimum-stability": "stable"
}

Editoval m.himlar (15. 4. 2015 14:50)

David Matějka
Moderator | 6445
+
0
-

Zkusil jsem tvuj kod a funguje mi. Nezatajujes neco? :) nepouzivas tam nejakym divnym zpusobem konstanty COLUMN_NICKNAME ?

m.himlar
Člen | 15
+
0
-

a ještě pro upřesnění :)

function __construct(Nette\Database\Context $database)
	{
		$this->database = $database;
	}
m.himlar
Člen | 15
+
0
-

David: nikde, ikdyž dám vyhledávat v phpstormu všude COLUMN_NICKNAME tak nic nenajde … divné, asi zkusit zpachtit nový projekt …

mimochodem, jaké řešení Ti fungovalo?

Editoval m.himlar (15. 4. 2015 15:02)

David Matějka
Moderator | 6445
+
0
-

Fungovalo hned to prvni $row->role->name

m.himlar
Člen | 15
+
0
-

už vím, kde byl problém … nastavil jsem v composeru aktualizaci na nette 2.3 a už vše funguje :) předtím použitá verze nette 2.2.8 (odhadem nějaký bug :))

Ale děkuji za námahu :)

Editoval m.himlar (15. 4. 2015 15:30)