Nette Database – Vysvětlení reflections
- Phalanx
- Člen | 310
Ahoj,
převzal jsem databázi a nemůžu ji měnit (běží na ní víc aplikací). Potřeboval bych vysvětlit reflections, jestli by byl někdo ochotný.
Používám Nette Database pro nový projekt a chci propojit v selection tabulky. Tabulky jsou vyrobené tak, že pokud je někde cizí klíč, přidá se k tomu jen „id“ tzn. „autorid“. Ovšem vše je bez cizích klíčů.
Z dokumentace v nastavení DB:
reflection: discovered # nebo conventional nebo classname, výchozí je discovered
Díval jsem se jak se vytváří convetional reflection a to by teoreticky mohlo nějak jít, kdyby se nemuseli přidávat cizí klíče.
<?php
public function __construct($primary = 'id', $foreign = '%s_id', $table = '%s')
?>
Potřebuju udělat jednoduchý select
<?php
$this->database->table('knihy')->select("*, autorid:autor.jmeno AS name");
?>
Děkuji
- Šaman
- Člen | 2666
Nepoužívám Nette\Database
jinak, než v best practice
struktuře, ale pokud bys měl s Nette\Database\Table
problém, pak
můžeš používat přímo sql query.
Pokud ti jde jen o občasnou práci s už hotovou databází bez klíčů, pak
bych to považoval za nejspolehlivější.
Editoval Šaman (12. 7. 2016 14:55)
- David Matějka
- Moderator | 6445
jestli se nepletu, tak to $foreign
nastav na %sid
a
pak pouzij autor.jmeno
- Phalanx
- Člen | 310
Zkouším vytvořit vlastní reflection. Jedu na Nette 2.3 – zjistil jsem,
že Conventional už je deprecated
https://api.nette.org/…entions.html
a místo toho je vhodnější použít StaticConventions
Vytvořil jsem si tedy kopii toho souboru, odmazal Nette namespace a přenastavil $primary + $foreign
<?php
public function __construct($primary = '%sid', $foreign = '%sid', $table = '%s')
?>
a do config.neon
<?php
database:
default:
dsn: '%db_default.dsn%'
...
reflection: \StaticConventions
?>
Šlape to jak má – díky za pomoc. Doufám, že tento příspěvek pomůže dalším lidem k vytvoření vlastních reflections (sám jsem tohle dlouho hledal a nenacházel)
- David Matějka
- Moderator | 6445
zkus jen
reflection: \Nette\Database\Conventions\StaticConventions('%sid', '%sid', '%s')
- Phalanx
- Člen | 310
Zkoušel jsem – obojí mi dává stejnou chybu. Asi se mýlím, ale zdá se mi, že na to není připraveno DatabaseExtension.php ř. 83 se strlower($config[‚conventions‘])
<?php
if (!empty($config['reflection'])) {
$conventionsServiceName = 'reflection';
$config['conventions'] = $config['reflection'];
if (strtolower($config['conventions']) === 'conventional') { -- ERROR: nepocita s array
$config['conventions'] = 'Static';
}
} else {
$conventionsServiceName = 'conventions';
}
// v config['reflection'] je
array(
entity => '\Nette\Database\Conventions\StaticConventions',
arguments => array (
0 => '%sid',
1 => '%sid',
2 => '%s'
)
)
?>
Zustavam nakonec u sveho reseni co jsem si upravil pouze na
<?php
class StaticConventions extends \Nette\Database\Conventions\StaticConventions
{
public function __construct($primary = '%sid', $foreign = '%sid', $table = '%s')
{
parent::__construct($primary, $foreign, $table);
}
}
// v configu
reflection: \StaticConventions
?>
Díky všem za ochotu