NDBT – spojenie tabuliek bez cudzieho kľúča

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

Sedím nad tým už dlho, ale bez pomoci sa ďalej asi nepohnem.

Je možné spojiť tabuľky pomocou stĺpcov, ktoré nie sú viazané cudzím kľúčom?

Aplikácia je už napísaná, ťažko je meniť štruktúru databázy kvôli jednému prípadu.

Takto je to v MySQL:

...
LEFT JOIN advice AS a ON o.id = a.order_id
LEFT JOIN station AS s ON s.car_number = a.car_number
...

A takto by to asi malo byť cez NDBT:

$wagons = $this->orders->findAll()
   ->select('order.id, order.code, :advice.amount, :advice.car_number,
      :advice.station(car_number).car_number')
   ->where('order.finished <>', 1)

Výsledkom je:

No reference found for $advice->station

Editoval jurajvt (25. 3. 2016 9:29)

CZechBoY
Člen | 3608
+
0
-

Musis vzdy pres primarni klic, jinak to ndbt neumi. Muzes si forknout knihovnu a upravit SqlBuilder. Taky jsme byli nuceni ;-)
Jinak muzes pouzit klasicky vlastni sql pres queryArgs(sql, args)

jurajvt
Člen | 18
+
0
-

Ďakujem. Problém pri query je, že chcem výstup použiť v Grido.

A to potom zahlási:

Model must implement \Grido\DataSources\IDataSource

Určite z toho existuje cesta von, ale ako to urobiť čo najčistejšie a najrýchlejšie…

Možno na to pozerám úplne nesprávne.

CZechBoY
Člen | 3608
+
+1
-

Tak to můžeš

  1. udělat fork ndbt a přidat si tam join přes jakýkoliv sloupec
  2. udělat datasource pro nette\database query v grido
  3. předat array
  4. použít jiný datagrid, viz https://forum.nette.org/…boo-datagrid

Editoval CZechBoY (25. 3. 2016 13:56)

jurajvt
Člen | 18
+
0
-

Opäť ďakujem :)

Samozrejme, nad všetkými možnosťami som rozmýšľal.

  1. Práve na tom vďaka Tebe pracujem :)
  2. Na dlhšie
  3. Naozaj tá posledná možnosť
  4. Na začiatku som rozhodol za Grido, teraz to už fakt nestíham prepísať
Eda
Backer | 220
+
0
-

A nestačilo by si jen přepsat DiscoveredConventions (pro příslušnou tabulku si předefinovat chování dvou metod z IConventions) a to si potom předat do Contextu? Nebo se pletu?

Forkování mi přijde jako kanón na vrabce :-)

Editoval Eda (27. 3. 2016 20:54)

jurajvt
Člen | 18
+
0
-

Neviem. Vždy hľadám nejaké čisté riešenie a až tak veľmi sa v best practices zatiaľ nevyznám. Vymenil som nakoniec grid, tá myšlienka s PHP-SQL-Parser je v ublaboo/datagrid naozaj dobrá.

Ale, ak by som chcel spraviť to, čo navrhuješ:

Vyrobím vlastné conventions (možno len cez override, alebo úplne nové) a nastavím ich v konštruktore repozitára príslušnej tabuľky pre Context?

public function __construct(IConventions $myConventions) {
	parent::__construct();
	$this->database->conventions = $myConventions;
}

Ja viem, nepatrí to tu, ale už keď si to načal… Je to takto prijateľné?

Eda
Backer | 220
+
0
-

Myslel jsem to tak, že bys do config.neon uvedl něco jako:

database:
	default:
		dsn: ...
		user: ...
		password: ...
		conventions: Nazev\Moji\Prepsane\Tridy

Tím by snad mělo dojít k tomu, že se přepíše defaultní služba pro konvence a využije se tvá třída.

Ta pak díky autowiringu bude předána i kontextu (jako třetí parametr konstruktoru) a o nic dalšího se nemusíš starat, tedy ani upravovat tvé Repository.

jurajvt
Člen | 18
+
+1
-

Aha. Ja som myslel, že si conventions prepíšem len pre konkrétny model.

Ale takto to dáva väčší zmysel a použiteľnosť.

Vyskúšam, zase budem o niečo múdrejší. Ďakujem za tip a čas.