Nette Database – Vysvětlení reflections

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

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
+
0
-

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)

Phalanx
Člen | 310
+
0
-

Potřebuju použít Selection

David Matějka
Moderator | 6445
+
0
-

jestli se nepletu, tak to $foreign nastav na %sid a pak pouzij autor.jmeno

Phalanx
Člen | 310
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

@Phalanx Teoreticky by melo stacit zmenit jen parametry konstruktoru, ne?

Phalanx
Člen | 310
+
0
-

@CZechBoY Určitě, ale jak bys to zapsal?

Zkoušel jsem bez úspěchu

<?php
	reflection:
		class: \Nette\Database\Conventions\StaticConventions('%sid', '%sid', '%s')
?>

Editoval Phalanx (12. 7. 2016 20:28)

David Matějka
Moderator | 6445
+
0
-

zkus jen

reflection: \Nette\Database\Conventions\StaticConventions('%sid', '%sid', '%s')
Phalanx
Člen | 310
+
0
-

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