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 | 2668
 
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