vícejazyčnost v Nette Database
- Filip111
- Člen | 244
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
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
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