vícejazyčnost v Nette Database

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

Ahoj, existuje nějaká best practise pro Nette Database a vícejazyčné záznamy?
Konkrétně mám např. článek v tabulce articles, kde je datum, uživatel, status apod. + tabulku articles_texts, kde je název článku, text, slug.

Otázka je, zda je lepší vytvářet dva modely, resp. dvě tabulky jako ArticlesTable a ArticlesTextsTable a s nimi samostatně pracovat (vytvoření např. `$this->connection->table('articles');`)
nebo si vytvořit jeden model, který bude obhospodařovat obě dvě tabulky.

Např. pro jednoduché vytažení dat z databáze jsem našel něco jako
$ndb->table(„table“)->where(„table2.column = ?“, $value); což by asi mělo udělat join tabulek articles a articles_texts, nicméně pro uložení nového článku asi budu potřebovat nějaký model, který zastřeší práci nad oběma tabulkami čímž se hodně stírá výhoda Nette Database. (?)

Sorry za případný nesmysly – s Nette DB zatím nemám zkušenost, do teď jsem používal dibi, ale stále nemůžu najít uspokojivý řešení modelu. Naposledy jsem zkoušel 5-ti vrtvý model s dibi, což je sice docela pěkný, ale hrozně moc psaní.

S Doctrine jsem už strávil spoustu času, ale rozhýbat to celé v Nette mi přijde příšerně složitý a když vidím závislosti, tak se mi chce zvracet (Doctrine, Nella nebo Kdyby, Symphony, dohromady asi 7MB kódu). Nic proti autorům :), mě děsí opravdu jen ty závislosti.

Začal jsem tedy pokukovat po Nette Database…
(trochu kacířsky přiznám, že jsem už začal koukat i po Symphony, kde je Doctrine tak nějak nativně implementovaná a nemusel bych sledovat vývoj dalších a dalších frameworků)

Díky.

David Ďurika
Člen | 328
+
0
-

k doctrine len tolko: jeto super ak robis fak velky projekt (viac ludi naraz) mas tam pekne ROM 5 vrstiev atd… ale na mensie a stredne stranky by som zbytocne nedaval, presne preto co si pisal…

k tej viacjazicnosti:
ja to robim tak ze mam tabulky

CREATE TABLE `phrase` (
  `id` varchar(255) NOT NULL DEFAULT '',
  `help` text,
  `type` varchar(255) DEFAULT NULL,
  `translated` int(1) unsigned DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `translation` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `phrase` varchar(255) DEFAULT NULL,
  `language` varchar(2) DEFAULT NULL,
  `text` text,
  PRIMARY KEY (`id`),
  KEY `phrase` (`phrase`),
  CONSTRAINT `phrase` FOREIGN KEY (`phrase`) REFERENCES `phrase` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

a potom ked mam tabulku s Articles a v nej je stlpec title tak ten obsahuje phrase.id

dalsie riesenie je ze bdes mat pre kadzy jazyk zvlast tabulku, napr: translation_en

obe riesenia maju vyhody aj nevihody…

Filip111
Člen | 244
+
0
-

To je docela zajímavý řešení…a asi se i celekem hodí na použití s Nette DB.

Řešení s tabulkama pojmenovanýma podle jazyka, např. translation_en se mi vůbec nelíbí. Musel bych kalkulovat s tím, že stejný projekt rozjetý u 10-ti klientů má vždy jinou strukturu DB a to nee.
Protože budu používat existující databázovou strukturu, chtěl bych setrvat vícejazyčných tabulek jak je mám nyní, takže spíš upřesním moji otázku.
Jak šikovně použít NetteDB pro následující strukturu vícejazyčných tabulek (zjednoušeno):

CREATE TABLE IF NOT EXISTS `articles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `datetime_from` datetime DEFAULT NULL,
  `datetime_to` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `articles_texts` (
  `id` int(10) unsigned NOT NULL,
  `lang` char(2) NOT NULL,
  `alias` varchar(100) NOT NULL DEFAULT '',
  `title` varchar(255) NOT NULL DEFAULT '',
  `description` varchar(255) NOT NULL DEFAULT '',
  `keywords` varchar(150) NOT NULL DEFAULT '',
  `text` text NOT NULL,
  PRIMARY KEY (`id`,`lang`),
);

id je reference na articles.id,
lang je reference languages.code